1package foo:foo;
2
3interface variants {
4  enum e1 {
5      a,
6  }
7
8  e1-arg: func(x: e1);
9  e1-result: func() -> e1;
10
11  record empty {}
12
13  variant v1 {
14      a,
15      c(e1),
16      d(string),
17      e(empty),
18      f,
19      g(u32),
20  }
21
22  v1-arg: func(x: v1);
23  v1-result: func() -> v1;
24
25  bool-arg: func(x: bool);
26  bool-result: func() -> bool;
27
28  option-arg: func(
29    a: option<bool>,
30    b: option<tuple<>>,
31    c: option<u32>,
32    d: option<e1>,
33    e: option<float32>,
34    g: option<option<bool>>,
35  );
36  option-result: func() -> tuple<
37    option<bool>,
38    option<tuple<>>,
39    option<u32>,
40    option<e1>,
41    option<float32>,
42    option<option<bool>>,
43  >;
44
45  variant casts1 {
46    a(s32),
47    b(float32),
48  }
49
50  variant casts2 {
51    a(float64),
52    b(float32),
53  }
54
55  variant casts3 {
56    a(float64),
57    b(u64),
58  }
59
60  variant casts4 {
61    a(u32),
62    b(s64),
63  }
64
65  variant casts5 {
66    a(float32),
67    b(s64),
68  }
69
70  variant casts6 {
71    a(tuple<float32, u32>),
72    b(tuple<u32, u32>),
73  }
74
75  casts: func(
76    a: casts1,
77    b: casts2,
78    c: casts3,
79    d: casts4,
80    e: casts5,
81    f: casts6,
82  ) -> tuple<
83    casts1,
84    casts2,
85    casts3,
86    casts4,
87    casts5,
88    casts6,
89  >;
90
91  result-arg: func(
92    a: result,
93    b: result<_, e1>,
94    c: result<e1>,
95    d: result<tuple<>, tuple<>>,
96    e: result<u32, v1>,
97    f: result<string, list<u8>>,
98  );
99  result-result: func() -> tuple<
100    result,
101    result<_, e1>,
102    result<e1>,
103    result<tuple<>, tuple<>>,
104    result<u32, v1>,
105    result<string, list<u8>>,
106  >;
107
108  enum my-errno {
109    bad1,
110    bad2,
111  }
112
113  return-result-sugar: func() -> result<s32, my-errno>;
114  return-result-sugar2: func() -> result<_, my-errno>;
115  return-result-sugar3: func() -> result<my-errno, my-errno>;
116  return-result-sugar4: func() -> result<tuple<s32, u32>, my-errno>;
117  return-option-sugar: func() -> option<s32>;
118  return-option-sugar2: func() -> option<my-errno>;
119
120  result-simple: func() -> result<u32, s32>;
121
122  record is-clone {
123    v1: v1,
124  }
125
126  is-clone-arg: func(a: is-clone);
127  is-clone-return: func() -> is-clone;
128
129  return-named-option: func() -> (a: option<u8>);
130  return-named-result: func() -> (a: result<u8, my-errno>);
131}
132
133world my-world {
134  import variants;
135  export variants;
136}
137