import std/typetraits, preserves type Error* {.preservesRecord: "error".} = object `message`*: string `detail`*: Preserve[void] Turn* = seq[TurnEvent] Message* {.preservesRecord: "message".} = object `body`*: Assertion Retract* {.preservesRecord: "retract".} = object `handle`*: Handle Assert* {.preservesRecord: "assert".} = object `assertion`*: Assertion `handle`*: Handle Extension* {.preservesRecord: "label".} = object `field0`*: seq[Preserve[void]] Sync* {.preservesRecord: "sync".} = object `peer`* {.preservesLiteral: "#!".}: tuple[] TurnEvent* {.preservesTuple.} = object `oid`*: Oid `event`*: Event Oid* = BiggestInt Assertion* = Preserve[void] Handle* = BiggestInt PacketKind* {.pure.} = enum `Turn`, `Error`, `Extension` `Packet`* {.preservesOr.} = object case orKind*: PacketKind of PacketKind.`Turn`: `turn`*: Turn of PacketKind.`Error`: `error`*: Error of PacketKind.`Extension`: `extension`*: Extension EventKind* {.pure.} = enum `Assert`, `Retract`, `Message`, `Sync` `Event`* {.preservesOr.} = object case orKind*: EventKind of EventKind.`Assert`: `assert`*: Assert of EventKind.`Retract`: `retract`*: Retract of EventKind.`Message`: `message`*: Message of EventKind.`Sync`: `sync`*: Sync proc `$`*(x: Error | Turn | Message | Retract | Assert | Extension | Sync | TurnEvent | Oid | Handle | Packet | Event): string = `$`(toPreserve(x)) proc encode*(x: Error | Turn | Message | Retract | Assert | Extension | Sync | TurnEvent | Oid | Handle | Packet | Event): seq[byte] = encode(toPreserve(x))