syndicate-nim/src/syndicate/protocols/protocol.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))