v2 / vlib / v / tests / generics / generic_smartcast_test.v
46 lines · 37 sloc · 612 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1fn cast_interface[T, U](u U) T {
2 $if U is $interface {
3 if u is T {
4 return u
5 } else {
6 panic('expected t to be ${typeof[T]().name}, got ${typeof[U]().name}')
7 }
8 } $else {
9 $compile_error('not an interface')
10 }
11}
12
13interface Foo {
14 f()
15}
16
17struct Bar {}
18
19fn (bar Bar) f() {}
20
21struct Baz {}
22
23fn (baz Baz) f() {}
24
25fn (_ Bar) g() int {
26 return 0
27}
28
29fn (_ Baz) g() int {
30 return 1
31}
32
33fn f(foo Foo) int {
34 if foo is Bar {
35 return cast_interface[Bar, Foo](foo).g()
36 }
37 if foo is Baz {
38 return cast_interface[Baz, Foo](foo).g()
39 }
40 return -1
41}
42
43fn test_main() {
44 assert f(Bar{}) == 0
45 assert f(Baz{}) == 1
46}
47