v / examples / compiletime
Raw file | 49 loc (43 sloc) | 1.03 KB | Latest commit hash ef5be22f8
1// An example deserializer implementation
2
3struct User {
4 name string
5 age int
6}
7
8fn main() {
9 data := 'name=Alice\nage=18'
10 user := decode[User](data)
11 println(user)
12}
13
14fn decode[T](data string) T {
15 mut result := T{}
16 // compile-time `for` loop
17 // T.fields gives an array of a field metadata type
18 $for field in T.fields {
19 $if field.typ is string {
20 // $(string_expr) produces an identifier
21 result.$(field.name) = get_string(data, field.name)
22 } $else $if field.typ is int {
23 result.$(field.name) = get_int(data, field.name)
24 }
25 }
26 return result
27}
28
29fn get_string(data string, field_name string) string {
30 for line in data.split_into_lines() {
31 key_val := line.split('=')
32 if key_val[0] == field_name {
33 return key_val[1]
34 }
35 }
36 return ''
37}
38
39fn get_int(data string, field string) int {
40 return get_string(data, field).int()
41}
42
43// `decode<User>` generates:
44// fn decode_User(data string) User {
45// mut result := User{}
46// result.name = get_string(data, 'name')
47// result.age = get_int(data, 'age')
48// return result
49// }