76 lines
1.7 KiB
Nim
76 lines
1.7 KiB
Nim
|
|
import
|
|
std/typetraits, preserves
|
|
|
|
type
|
|
Error*[E] {.preservesRecord: "error".} = ref object
|
|
`message`*: string
|
|
`detail`*: Preserve[E]
|
|
|
|
Turn*[E] = seq[TurnEvent[E]]
|
|
Message*[E] {.preservesRecord: "message".} = ref object
|
|
`body`*: Assertion[E]
|
|
|
|
Retract* {.preservesRecord: "retract".} = object
|
|
`handle`*: Handle
|
|
|
|
Assert*[E] {.preservesRecord: "assert".} = ref object
|
|
`assertion`*: Assertion[E]
|
|
`handle`*: Handle
|
|
|
|
Sync*[E] {.preservesRecord: "sync".} = ref object
|
|
`peer`*: Preserve[E]
|
|
|
|
TurnEvent*[E] {.preservesTuple.} = ref object
|
|
`oid`*: Oid
|
|
`event`*: Event[E]
|
|
|
|
Oid* = int
|
|
Assertion*[E] = Preserve[E]
|
|
Handle* = int
|
|
PacketKind* {.pure.} = enum
|
|
`Turn`, `Error`
|
|
`Packet`*[E] {.preservesOr.} = ref object
|
|
case orKind*: PacketKind
|
|
of PacketKind.`Turn`:
|
|
`turn`*: Turn[E]
|
|
|
|
of PacketKind.`Error`:
|
|
`error`*: Error[E]
|
|
|
|
|
|
EventKind* {.pure.} = enum
|
|
`Assert`, `Retract`, `Message`, `Sync`
|
|
`Event`*[E] {.preservesOr.} = ref object
|
|
case orKind*: EventKind
|
|
of EventKind.`Assert`:
|
|
`assert`*: Assert[E]
|
|
|
|
of EventKind.`Retract`:
|
|
`retract`*: Retract
|
|
|
|
of EventKind.`Message`:
|
|
`message`*: Message[E]
|
|
|
|
of EventKind.`Sync`:
|
|
`sync`*: Sync[E]
|
|
|
|
|
|
proc `$`*[E](x: Error[E] | Turn[E] | Message[E] | Assert[E] | Sync[E] |
|
|
TurnEvent[E] |
|
|
Packet[E] |
|
|
Event[E]): string =
|
|
`$`(toPreserve(x, E))
|
|
|
|
proc encode*[E](x: Error[E] | Turn[E] | Message[E] | Assert[E] | Sync[E] |
|
|
TurnEvent[E] |
|
|
Packet[E] |
|
|
Event[E]): seq[byte] =
|
|
encode(toPreserve(x, E))
|
|
|
|
proc `$`*(x: Retract | Oid | Handle): string =
|
|
`$`(toPreserve(x))
|
|
|
|
proc encode*(x: Retract | Oid | Handle): seq[byte] =
|
|
encode(toPreserve(x))
|