80 lines
1.7 KiB
Nim
80 lines
1.7 KiB
Nim
|
|
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: "#!<lit #t>".}: 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))
|