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

123 lines
3.1 KiB
Nim

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