| 1 | @[heap] |
| 2 | struct Client { |
| 3 | mut: |
| 4 | ready_callback ReadyHandler = unsafe { nil } |
| 5 | message_callback MessageHandler = unsafe { nil } |
| 6 | } |
| 7 | |
| 8 | struct Ready {} |
| 9 | |
| 10 | struct Message {} |
| 11 | |
| 12 | type ReadyHandler = fn (mut c Client, msg &Ready) |
| 13 | |
| 14 | type MessageHandler = fn (mut c Client, msg &Message) |
| 15 | |
| 16 | fn (mut client Client) on[T](event string, handler fn (mut c Client, msg &T)) { |
| 17 | $if T is Ready { |
| 18 | if event == 'ready' { |
| 19 | client.ready_callback = handler |
| 20 | } |
| 21 | } $else $if T is Message { |
| 22 | if event == 'message_create' { |
| 23 | client.message_callback = handler |
| 24 | } |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | fn on_ready(mut _client Client, _message &Ready) {} |
| 29 | |
| 30 | fn on_message(mut _client Client, _message &Message) {} |
| 31 | |
| 32 | fn main() { |
| 33 | mut client := &Client{} |
| 34 | client.on[Ready]('ready', on_ready) |
| 35 | client.on[Message]('message_create', on_message) |
| 36 | } |
| 37 | |