| 1 | fn 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 | |
| 13 | interface Foo { |
| 14 | f() |
| 15 | } |
| 16 | |
| 17 | struct Bar {} |
| 18 | |
| 19 | fn (bar Bar) f() {} |
| 20 | |
| 21 | struct Baz {} |
| 22 | |
| 23 | fn (baz Baz) f() {} |
| 24 | |
| 25 | fn (_ Bar) g() int { |
| 26 | return 0 |
| 27 | } |
| 28 | |
| 29 | fn (_ Baz) g() int { |
| 30 | return 1 |
| 31 | } |
| 32 | |
| 33 | fn 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 | |
| 43 | fn test_main() { |
| 44 | assert f(Bar{}) == 0 |
| 45 | assert f(Baz{}) == 1 |
| 46 | } |
| 47 | |