syndicate-nim/src/syndicate/protocols/stream.nim

122 lines
3.0 KiB
Nim
Raw Normal View History

import
std/typetraits, preserves
type
2021-09-24 19:25:47 +00:00
CreditAmountKind* {.pure.} = enum
`count`, `unbounded`
2021-11-03 18:21:52 +00:00
CreditAmountCount* = int
2021-09-24 19:25:47 +00:00
`CreditAmount`* {.preservesOr.} = object
case orKind*: CreditAmountKind
of CreditAmountKind.`count`:
`count`*: CreditAmountCount
2021-09-24 19:25:47 +00:00
of CreditAmountKind.`unbounded`:
`unbounded`* {.preservesLiteral: "unbounded".}: bool
2021-09-24 19:25:47 +00:00
StreamError* {.preservesRecord: "error".} = object
`message`*: string
2021-09-24 19:25:47 +00:00
StreamListenerError*[E] {.preservesRecord: "stream-listener-error".} = ref object
`spec`*: Preserve[E]
`message`*: string
2021-09-24 19:25:47 +00:00
StreamConnection*[E] {.preservesRecord: "stream-connection".} = ref object
`source`*: Preserve[E]
`sink`*: Preserve[E]
`spec`*: Preserve[E]
`LineMode`* {.preservesOr.} = enum
`lf`, `crlf`
SourceKind* {.pure.} = enum
2021-09-24 19:25:47 +00:00
`sink`, `StreamError`, `credit`
SourceSink*[E] {.preservesRecord: "sink".} = ref object
`controller`*: Preserve[E]
2021-09-24 19:25:47 +00:00
SourceCredit*[E] {.preservesRecord: "credit".} = ref object
`amount`*: CreditAmount
`mode`*: Mode[E]
2021-09-24 19:25:47 +00:00
`Source`*[E] {.preservesOr.} = ref object
case orKind*: SourceKind
of SourceKind.`sink`:
2021-09-24 19:25:47 +00:00
`sink`*: SourceSink[E]
2021-09-24 19:25:47 +00:00
of SourceKind.`StreamError`:
`streamerror`*: StreamError
of SourceKind.`credit`:
2021-09-24 19:25:47 +00:00
`credit`*: SourceCredit[E]
SinkKind* {.pure.} = enum
2021-09-24 19:25:47 +00:00
`source`, `StreamError`, `data`, `eof`
SinkSource*[E] {.preservesRecord: "source".} = ref object
`controller`*: Preserve[E]
2021-09-24 19:25:47 +00:00
SinkData*[E] {.preservesRecord: "data".} = ref object
`payload`*: Preserve[E]
`mode`*: Mode[E]
2021-09-24 19:25:47 +00:00
SinkEof* {.preservesRecord: "eof".} = object
`Sink`*[E] {.preservesOr.} = ref object
case orKind*: SinkKind
of SinkKind.`source`:
2021-09-24 19:25:47 +00:00
`source`*: SinkSource[E]
2021-09-24 19:25:47 +00:00
of SinkKind.`StreamError`:
`streamerror`*: StreamError
of SinkKind.`data`:
2021-09-24 19:25:47 +00:00
`data`*: SinkData[E]
of SinkKind.`eof`:
2021-09-24 19:25:47 +00:00
`eof`*: SinkEof
2021-09-24 19:25:47 +00:00
StreamListenerReady*[E] {.preservesRecord: "stream-listener-ready".} = ref object
`spec`*: Preserve[E]
ModeKind* {.pure.} = enum
`bytes`, `lines`, `packet`, `object`
2021-09-24 19:25:47 +00:00
ModePacket* {.preservesRecord: "packet".} = object
2021-11-03 18:21:52 +00:00
`size`*: int
2021-09-24 19:25:47 +00:00
ModeObject*[E] {.preservesRecord: "object".} = ref object
`description`*: Preserve[E]
2021-09-24 19:25:47 +00:00
`Mode`*[E] {.preservesOr.} = ref object
case orKind*: ModeKind
of ModeKind.`bytes`:
2021-09-24 19:25:47 +00:00
`bytes`* {.preservesLiteral: "bytes".}: bool
of ModeKind.`lines`:
`lines`*: LineMode
of ModeKind.`packet`:
2021-09-24 19:25:47 +00:00
`packet`*: ModePacket
of ModeKind.`object`:
2021-09-24 19:25:47 +00:00
`object`*: ModeObject[E]
2021-09-24 19:25:47 +00:00
proc `$`*[E](x: StreamListenerError[E] | StreamConnection[E] | Source[E] |
Sink[E] |
2021-09-24 19:25:47 +00:00
StreamListenerReady[E] |
Mode[E]): string =
`$`(toPreserve(x, E))
2021-09-24 19:25:47 +00:00
proc encode*[E](x: StreamListenerError[E] | StreamConnection[E] | Source[E] |
Sink[E] |
2021-09-24 19:25:47 +00:00
StreamListenerReady[E] |
Mode[E]): seq[byte] =
encode(toPreserve(x, E))
2021-09-24 19:25:47 +00:00
proc `$`*(x: CreditAmount | StreamError): string =
`$`(toPreserve(x))
proc encode*(x: CreditAmount | StreamError): seq[byte] =
encode(toPreserve(x))