| 1 | @[foo: true] |
| 2 | @[name: 'abc'] |
| 3 | @[amount: 2] |
| 4 | @[abc] |
| 5 | struct Abc {} |
| 6 | |
| 7 | fn test_comptime_for_attributes() { |
| 8 | mut res := '' |
| 9 | mut amount := 0 |
| 10 | $for attr in Abc.attributes { |
| 11 | if attr.name == 'amount' && attr.has_arg && attr.kind == .number { |
| 12 | amount = attr.arg.int() |
| 13 | } |
| 14 | if attr.name == 'name' && attr.has_arg && attr.kind == .string { |
| 15 | res = attr.arg |
| 16 | } |
| 17 | } |
| 18 | res = res.repeat(amount) |
| 19 | assert res == 'abcabc' |
| 20 | } |
| 21 | |
| 22 | fn test_attributes() { |
| 23 | $for attr in Abc.attributes { |
| 24 | if attr.has_arg && attr.kind == .string { |
| 25 | assert attr.name == 'name' |
| 26 | assert attr.arg == 'abc' |
| 27 | } else if attr.has_arg && attr.kind == .number { |
| 28 | assert attr.name == 'amount' |
| 29 | assert attr.arg == '2' |
| 30 | } else if attr.kind != .bool { |
| 31 | assert attr.name == 'abc' |
| 32 | } |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | fn test_attr_boolean() { |
| 37 | mut bool_fields := []string{} |
| 38 | $for attr in Abc.attributes { |
| 39 | if attr.kind == .bool { |
| 40 | bool_fields << attr.name |
| 41 | } |
| 42 | } |
| 43 | assert bool_fields.len == 1 |
| 44 | assert bool_fields[0] == 'foo' |
| 45 | } |
| 46 | |