2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
import
|
|
|
|
std/typetraits, preserves
|
|
|
|
|
|
|
|
type
|
2021-09-24 19:25:47 +00:00
|
|
|
CreditAmountKind* {.pure.} = enum
|
|
|
|
`count`, `unbounded`
|
2022-07-08 12:49:24 +00:00
|
|
|
CreditAmountCount* = BiggestInt
|
2021-09-24 19:25:47 +00:00
|
|
|
`CreditAmount`* {.preservesOr.} = object
|
|
|
|
case orKind*: CreditAmountKind
|
|
|
|
of CreditAmountKind.`count`:
|
|
|
|
`count`*: CreditAmountCount
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2021-09-24 19:25:47 +00:00
|
|
|
of CreditAmountKind.`unbounded`:
|
|
|
|
`unbounded`* {.preservesLiteral: "unbounded".}: bool
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2021-09-24 19:25:47 +00:00
|
|
|
|
|
|
|
StreamError* {.preservesRecord: "error".} = object
|
2021-10-06 09:30:38 +00:00
|
|
|
`message`*: string
|
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
StreamListenerError*[Cap] {.preservesRecord: "stream-listener-error".} = object
|
|
|
|
`spec`*: Preserve[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
`message`*: string
|
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
StreamConnection*[Cap] {.preservesRecord: "stream-connection".} = object
|
|
|
|
`source`*: Cap
|
|
|
|
`sink`*: Cap
|
|
|
|
`spec`*: Preserve[Cap]
|
2021-09-24 19:25:47 +00:00
|
|
|
|
2022-03-07 23:53:05 +00:00
|
|
|
`LineMode`* {.preservesOr, pure.} = enum
|
2021-09-24 19:25:47 +00:00
|
|
|
`lf`, `crlf`
|
2021-10-06 09:30:38 +00:00
|
|
|
SourceKind* {.pure.} = enum
|
2021-09-24 19:25:47 +00:00
|
|
|
`sink`, `StreamError`, `credit`
|
2022-12-08 08:15:01 +00:00
|
|
|
SourceSink*[Cap] {.preservesRecord: "sink".} = object
|
|
|
|
`controller`*: Cap
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
SourceCredit*[Cap] {.preservesRecord: "credit".} = object
|
2021-10-06 09:30:38 +00:00
|
|
|
`amount`*: CreditAmount
|
2022-12-08 08:15:01 +00:00
|
|
|
`mode`*: Mode[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
`Source`*[Cap] {.preservesOr.} = object
|
2021-09-24 19:25:47 +00:00
|
|
|
case orKind*: SourceKind
|
2021-10-06 09:30:38 +00:00
|
|
|
of SourceKind.`sink`:
|
2022-12-08 08:15:01 +00:00
|
|
|
`sink`*: SourceSink[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2021-09-24 19:25:47 +00:00
|
|
|
of SourceKind.`StreamError`:
|
2021-10-06 09:30:38 +00:00
|
|
|
`streamerror`*: StreamError
|
|
|
|
|
|
|
|
of SourceKind.`credit`:
|
2022-12-08 08:15:01 +00:00
|
|
|
`credit`*: SourceCredit[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
SinkKind* {.pure.} = enum
|
2021-09-24 19:25:47 +00:00
|
|
|
`source`, `StreamError`, `data`, `eof`
|
2022-12-08 08:15:01 +00:00
|
|
|
SinkSource*[Cap] {.preservesRecord: "source".} = object
|
|
|
|
`controller`*: Cap
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
SinkData*[Cap] {.preservesRecord: "data".} = object
|
|
|
|
`payload`*: Preserve[Cap]
|
|
|
|
`mode`*: Mode[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2021-09-24 19:25:47 +00:00
|
|
|
SinkEof* {.preservesRecord: "eof".} = object
|
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
`Sink`*[Cap] {.preservesOr.} = object
|
2021-09-24 19:25:47 +00:00
|
|
|
case orKind*: SinkKind
|
2021-10-06 09:30:38 +00:00
|
|
|
of SinkKind.`source`:
|
2022-12-08 08:15:01 +00:00
|
|
|
`source`*: SinkSource[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2021-09-24 19:25:47 +00:00
|
|
|
of SinkKind.`StreamError`:
|
2021-10-06 09:30:38 +00:00
|
|
|
`streamerror`*: StreamError
|
|
|
|
|
|
|
|
of SinkKind.`data`:
|
2022-12-08 08:15:01 +00:00
|
|
|
`data`*: SinkData[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
of SinkKind.`eof`:
|
2021-09-24 19:25:47 +00:00
|
|
|
`eof`*: SinkEof
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
StreamListenerReady*[Cap] {.preservesRecord: "stream-listener-ready".} = object
|
|
|
|
`spec`*: Preserve[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
ModeKind* {.pure.} = enum
|
|
|
|
`bytes`, `lines`, `packet`, `object`
|
2021-09-24 19:25:47 +00:00
|
|
|
ModePacket* {.preservesRecord: "packet".} = object
|
2022-07-08 12:49:24 +00:00
|
|
|
`size`*: BiggestInt
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
ModeObject*[Cap] {.preservesRecord: "object".} = object
|
|
|
|
`description`*: Preserve[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
`Mode`*[Cap] {.preservesOr.} = object
|
2021-09-24 19:25:47 +00:00
|
|
|
case orKind*: ModeKind
|
2021-10-06 09:30:38 +00:00
|
|
|
of ModeKind.`bytes`:
|
2021-09-24 19:25:47 +00:00
|
|
|
`bytes`* {.preservesLiteral: "bytes".}: bool
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
of ModeKind.`lines`:
|
|
|
|
`lines`*: LineMode
|
|
|
|
|
|
|
|
of ModeKind.`packet`:
|
2021-09-24 19:25:47 +00:00
|
|
|
`packet`*: ModePacket
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
of ModeKind.`object`:
|
2022-12-08 08:15:01 +00:00
|
|
|
`object`*: ModeObject[Cap]
|
2021-10-06 09:30:38 +00:00
|
|
|
|
|
|
|
|
2022-12-08 08:15:01 +00:00
|
|
|
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))
|
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))
|