Move protocols to a submodule
The code generated from the protocols is commited here so the submodule doesn't need to be checked out to build.
This commit is contained in:
parent
3509573f55
commit
8447822243
|
@ -1,3 +1,5 @@
|
|||
tests/test_box_and_client
|
||||
tests/test_dsl
|
||||
tests/test_timer
|
||||
*.nim.check
|
||||
.tup
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
[submodule "preserves"]
|
||||
path = preserves
|
||||
url = ./preserves
|
||||
[submodule "protocols"]
|
||||
path = protocols
|
||||
url = https://git.syndicate-lang.org/syndicate-lang/syndicate-protocols.git
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 6cfd97c91ae15197190ad50c71b8cfcd45da0f6e
|
|
@ -1,4 +0,0 @@
|
|||
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
|
||||
type EventKind* = enum addedEvent, removedEvent, messageEvent
|
|
@ -1,8 +0,0 @@
|
|||
all: schema-bundle.bin
|
||||
|
||||
clean:
|
||||
rm -f schema-bundle.bin
|
||||
|
||||
schema-bundle.bin: schemas/*.prs
|
||||
preserves-schemac schemas/*.prs > $@.tmp
|
||||
mv $@.tmp $@
|
|
@ -0,0 +1,7 @@
|
|||
preserves_schema_nim = ../../../preserves/preserves_schema_nim
|
||||
|
||||
!preserves_schema_nim = | $(preserves_schema_nim) |> $(preserves_schema_nim) %f |> %B.nim
|
||||
|
||||
: foreach ../../../protocols/schemas/*.prs |> !preserves_schema_nim |> {gen}
|
||||
|
||||
: foreach {gen} | {gen} |> nim check %f; touch %o |> .%B.nim.check {gen}
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves, dataspacePatterns
|
||||
|
||||
type
|
||||
Observe*[E = void] {.record: "Observe".} = ref object ## ``<Observe @pattern dataspacePatterns.Pattern @observer #!any>``
|
||||
`pattern`*: dataspacePatterns.Pattern
|
||||
`observer`*: Preserve[E]
|
||||
|
||||
proc `observe`*[E = void](`pattern`: dataspacePatterns.Pattern | Preserve[E];
|
||||
`observer`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Observe``.
|
||||
initRecord[E](symbol[E]("Observe"), toPreserve(`pattern`, E),
|
||||
toPreserve(`observer`, E))
|
||||
|
||||
proc toPreserveHook*(`observe`: Observe; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("Observe"), toPreserve(`observe`.`pattern`, E),
|
||||
toPreserve(`observe`.`observer`, E))
|
||||
|
||||
proc `$`*[E](x: Observe[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Observe[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,166 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves, std/tables, std/tables, std/tables
|
||||
|
||||
type
|
||||
PatternKind* {.pure.} = enum
|
||||
`Ddiscard`, `Dbind`, `Dlit`, `Dcompound`
|
||||
Pattern*[E = void] = ref object ## ``/ DDiscard / DBind / DLit / DCompound``
|
||||
case kind*: PatternKind
|
||||
of PatternKind.`Ddiscard`:
|
||||
`ddiscard`*: DDiscard
|
||||
|
||||
of PatternKind.`Dbind`:
|
||||
`dbind`*: DBind[E]
|
||||
|
||||
of PatternKind.`Dlit`:
|
||||
`dlit`*: DLit[E]
|
||||
|
||||
of PatternKind.`Dcompound`:
|
||||
`dcompound`*: DCompound[E]
|
||||
|
||||
|
||||
DDiscard* {.record: "_".} = object ## ``<_>``
|
||||
discard
|
||||
|
||||
DBind*[E = void] {.record: "bind".} = ref object ## ``<bind @pattern Pattern>``
|
||||
`pattern`*: Pattern[E]
|
||||
|
||||
DLit*[E = void] {.record: "lit".} = ref object ## ``<lit @value any>``
|
||||
`value`*: Preserve[E]
|
||||
|
||||
DcompoundKind* {.pure.} = enum
|
||||
`rec`, `arr`, `dict`
|
||||
DCompoundrec*[E = void] {.record: "compound".} = ref object
|
||||
`ctor`*: CRec[E]
|
||||
`members`*: TableRef[BiggestInt, Pattern[E]]
|
||||
|
||||
DCompoundarr*[E = void] {.record: "compound".} = ref object
|
||||
`ctor`*: CArr
|
||||
`members`*: TableRef[BiggestInt, Pattern[E]]
|
||||
|
||||
DCompounddict*[E = void] {.record: "compound".} = ref object
|
||||
`ctor`*: CDict
|
||||
`members`*: TableRef[Preserve[E], Pattern[E]]
|
||||
|
||||
DCompound*[E = void] = ref object ## ``/ <compound @ctor CRec @members {int : Pattern ...:...}> / <compound @ctor CArr @members {int : Pattern ...:...}> / <compound @ctor CDict @members {any : Pattern ...:...}>``
|
||||
case kind*: DcompoundKind
|
||||
of DcompoundKind.`rec`:
|
||||
`rec`*: DCompoundrec[E]
|
||||
|
||||
of DcompoundKind.`arr`:
|
||||
`arr`*: DCompoundarr[E]
|
||||
|
||||
of DcompoundKind.`dict`:
|
||||
`dict`*: DCompounddict[E]
|
||||
|
||||
|
||||
CRec*[E = void] {.record: "rec".} = ref object ## ``<rec @label any @arity int>``
|
||||
`label`*: Preserve[E]
|
||||
`arity`*: BiggestInt
|
||||
|
||||
CArr* {.record: "arr".} = ref object ## ``<arr @arity int>``
|
||||
`arity`*: BiggestInt
|
||||
|
||||
CDict* {.record: "dict".} = object ## ``<dict>``
|
||||
discard
|
||||
|
||||
proc toPreserveHook*(v: Pattern; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of PatternKind.`Ddiscard`:
|
||||
toPreserve(v.`ddiscard`, E)
|
||||
of PatternKind.`Dbind`:
|
||||
toPreserve(v.`dbind`, E)
|
||||
of PatternKind.`Dlit`:
|
||||
toPreserve(v.`dlit`, E)
|
||||
of PatternKind.`Dcompound`:
|
||||
toPreserve(v.`dcompound`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Pattern; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("DDiscard"):
|
||||
v = Pattern(kind: PatternKind.`Ddiscard`)
|
||||
result = fromPreserve(v.`ddiscard`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("DBind"):
|
||||
v = Pattern(kind: PatternKind.`Dbind`)
|
||||
result = fromPreserve(v.`dbind`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("DLit"):
|
||||
v = Pattern(kind: PatternKind.`Dlit`)
|
||||
result = fromPreserve(v.`dlit`, pr)
|
||||
elif false: ## snkOr - / <compound @ctor CRec @members {int : Pattern ...:...}> / <compound @ctor CArr @members {int : Pattern ...:...}> / <compound @ctor CDict @members {any : Pattern ...:...}>
|
||||
discard
|
||||
|
||||
proc `dDiscard`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``DDiscard``.
|
||||
initRecord[E](symbol[E]("_"))
|
||||
|
||||
proc toPreserveHook*(`ddiscard`: DDiscard; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("_"))
|
||||
|
||||
proc `dBind`*[E = void](`pattern`: Pattern | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``DBind``.
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`pattern`, E))
|
||||
|
||||
proc toPreserveHook*(`dbind`: DBind; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`dbind`.`pattern`, E))
|
||||
|
||||
proc `dLit`*[E = void](`value`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``DLit``.
|
||||
initRecord[E](symbol[E]("lit"), toPreserve(`value`, E))
|
||||
|
||||
proc toPreserveHook*(`dlit`: DLit; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("lit"), toPreserve(`dlit`.`value`, E))
|
||||
|
||||
proc toPreserveHook*(v: DCompound; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of DCompoundKind.`rec`:
|
||||
toPreserve(v.`rec`, E)
|
||||
of DCompoundKind.`arr`:
|
||||
toPreserve(v.`arr`, E)
|
||||
of DCompoundKind.`dict`:
|
||||
toPreserve(v.`dict`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var DCompound; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("rec"):
|
||||
v = DCompound(kind: DCompoundKind.`rec`)
|
||||
result = fromPreserve(v.`rec`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("arr"):
|
||||
v = DCompound(kind: DCompoundKind.`arr`)
|
||||
result = fromPreserve(v.`arr`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("dict"):
|
||||
v = DCompound(kind: DCompoundKind.`dict`)
|
||||
result = fromPreserve(v.`dict`, pr)
|
||||
|
||||
proc `cRec`*[E = void](`label`: Preserve[E]; `arity`: BiggestInt | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``CRec``.
|
||||
initRecord[E](symbol[E]("rec"), toPreserve(`label`, E), toPreserve(`arity`, E))
|
||||
|
||||
proc toPreserveHook*(`crec`: CRec; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("rec"), toPreserve(`crec`.`label`, E),
|
||||
toPreserve(`crec`.`arity`, E))
|
||||
|
||||
proc `cArr`*[E = void](`arity`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``CArr``.
|
||||
initRecord[E](symbol[E]("arr"), toPreserve(`arity`, E))
|
||||
|
||||
proc toPreserveHook*(`carr`: CArr; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("arr"), toPreserve(`carr`.`arity`, E))
|
||||
|
||||
proc `cDict`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``CDict``.
|
||||
initRecord[E](symbol[E]("dict"))
|
||||
|
||||
proc toPreserveHook*(`cdict`: CDict; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("dict"))
|
||||
|
||||
proc `$`*[E](x: Pattern[E] | DDiscard | DBind[E] | DLit[E] | DCompound[E] |
|
||||
CRec[E] |
|
||||
CArr |
|
||||
CDict): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Pattern[E] | DDiscard | DBind[E] | DLit[E] | DCompound[E] |
|
||||
CRec[E] |
|
||||
CArr |
|
||||
CDict): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves, sturdy
|
||||
|
||||
type
|
||||
Resolve*[E = void] {.record: "resolve".} = ref object ## ``<resolve @sturdyref sturdy.SturdyRef @observer #!#!any>``
|
||||
`sturdyref`*: sturdy.SturdyRef
|
||||
`observer`*: Preserve[E]
|
||||
|
||||
Bind*[E = void] {.record: "bind".} = ref object ## ``<bind @oid any @key bytes @target #!any>``
|
||||
`oid`*: Preserve[E]
|
||||
`key`*: seq[byte]
|
||||
`target`*: Preserve[E]
|
||||
|
||||
proc `resolve`*[E = void](`sturdyref`: sturdy.SturdyRef | Preserve[E];
|
||||
`observer`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Resolve``.
|
||||
initRecord[E](symbol[E]("resolve"), toPreserve(`sturdyref`, E),
|
||||
toPreserve(`observer`, E))
|
||||
|
||||
proc toPreserveHook*(`resolve`: Resolve; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("resolve"), toPreserve(`resolve`.`sturdyref`, E),
|
||||
toPreserve(`resolve`.`observer`, E))
|
||||
|
||||
proc `bind`*[E = void](`oid`: Preserve[E]; `key`: seq[byte] | Preserve[E];
|
||||
`target`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Bind``.
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`oid`, E), toPreserve(`key`, E),
|
||||
toPreserve(`target`, E))
|
||||
|
||||
proc toPreserveHook*(`bind`: Bind; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`bind`.`oid`, E),
|
||||
toPreserve(`bind`.`key`, E), toPreserve(`bind`.`target`, E))
|
||||
|
||||
proc `$`*[E](x: Resolve[E] | Bind[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Resolve[E] | Bind[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
Binary file not shown.
|
@ -0,0 +1,157 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
PacketKind* {.pure.} = enum
|
||||
`Turn`, `Error`
|
||||
Packet*[E = void] = ref object ## ``/ Turn / Error``
|
||||
case kind*: PacketKind
|
||||
of PacketKind.`Turn`:
|
||||
`turn`*: Turn[E]
|
||||
|
||||
of PacketKind.`Error`:
|
||||
`error`*: Error[E]
|
||||
|
||||
|
||||
Error*[E = void] {.record: "error".} = ref object ## ``<error @message string @detail any>``
|
||||
`message`*: string
|
||||
`detail`*: Preserve[E]
|
||||
|
||||
Assertion*[E = void] = Preserve[E] ## ``any``
|
||||
Handle* = distinct BiggestInt ## ``int``
|
||||
EventKind* {.pure.} = enum
|
||||
`Assert`, `Retract`, `Message`, `Sync`
|
||||
Event*[E = void] = ref object ## ``/ Assert / Retract / Message / Sync``
|
||||
case kind*: EventKind
|
||||
of EventKind.`Assert`:
|
||||
`assert`*: Assert[E]
|
||||
|
||||
of EventKind.`Retract`:
|
||||
`retract`*: Retract
|
||||
|
||||
of EventKind.`Message`:
|
||||
`message`*: Message[E]
|
||||
|
||||
of EventKind.`Sync`:
|
||||
`sync`*: Sync
|
||||
|
||||
|
||||
Oid* = distinct BiggestInt ## ``int``
|
||||
Turn*[E = void] = seq[TurnEvent[E]] ## ``[ TurnEvent ... ]``
|
||||
TurnEvent*[E = void] = tuple[`oid`: Oid, `event`: Event[E]] ## ``[@oid Oid @event Event]``
|
||||
Assert*[E = void] {.record: "assert".} = ref object ## ``<assert @assertion Assertion @handle Handle>``
|
||||
`assertion`*: Assertion[E]
|
||||
`handle`*: Handle
|
||||
|
||||
Retract* {.record: "retract".} = ref object ## ``<retract @handle Handle>``
|
||||
`handle`*: Handle
|
||||
|
||||
Message*[E = void] {.record: "message".} = ref object ## ``<message @body Assertion>``
|
||||
`body`*: Assertion[E]
|
||||
|
||||
Sync* {.record: "sync".} = ref object ## ``<sync @peer #!#t>``
|
||||
`peer`*: bool
|
||||
|
||||
proc toPreserveHook*(v: Packet; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of PacketKind.`Turn`:
|
||||
toPreserve(v.`turn`, E)
|
||||
of PacketKind.`Error`:
|
||||
toPreserve(v.`error`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Packet; pr: Preserve[E]): bool =
|
||||
if false:
|
||||
discard
|
||||
elif isRecord(pr) and pr.label.isSymbol("Error"):
|
||||
v = Packet(kind: PacketKind.`Error`)
|
||||
result = fromPreserve(v.`error`, pr)
|
||||
|
||||
proc `error`*[E = void](`message`: string | Preserve[E]; `detail`: Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``Error``.
|
||||
initRecord[E](symbol[E]("error"), toPreserve(`message`, E),
|
||||
toPreserve(`detail`, E))
|
||||
|
||||
proc toPreserveHook*(`error`: Error; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("error"), toPreserve(`error`.`message`, E),
|
||||
toPreserve(`error`.`detail`, E))
|
||||
|
||||
proc toPreserveHook*(v: Event; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of EventKind.`Assert`:
|
||||
toPreserve(v.`assert`, E)
|
||||
of EventKind.`Retract`:
|
||||
toPreserve(v.`retract`, E)
|
||||
of EventKind.`Message`:
|
||||
toPreserve(v.`message`, E)
|
||||
of EventKind.`Sync`:
|
||||
toPreserve(v.`sync`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Event; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("Assert"):
|
||||
v = Event(kind: EventKind.`Assert`)
|
||||
result = fromPreserve(v.`assert`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Retract"):
|
||||
v = Event(kind: EventKind.`Retract`)
|
||||
result = fromPreserve(v.`retract`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Message"):
|
||||
v = Event(kind: EventKind.`Message`)
|
||||
result = fromPreserve(v.`message`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Sync"):
|
||||
v = Event(kind: EventKind.`Sync`)
|
||||
result = fromPreserve(v.`sync`, pr)
|
||||
|
||||
proc toPreserveHook*(`turnevent`: TurnEvent; E: typedesc): Preserve[E] =
|
||||
Preserve[E](kind: pkSequence, sequence: @[toPreserve(`turnevent`.`oid`, E),
|
||||
toPreserve(`turnevent`.`event`, E)])
|
||||
|
||||
proc `assert`*[E = void](`assertion`: Assertion | Preserve[E];
|
||||
`handle`: Handle | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Assert``.
|
||||
initRecord[E](symbol[E]("assert"), toPreserve(`assertion`, E),
|
||||
toPreserve(`handle`, E))
|
||||
|
||||
proc toPreserveHook*(`assert`: Assert; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("assert"), toPreserve(`assert`.`assertion`, E),
|
||||
toPreserve(`assert`.`handle`, E))
|
||||
|
||||
proc `retract`*[E = void](`handle`: Handle | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Retract``.
|
||||
initRecord[E](symbol[E]("retract"), toPreserve(`handle`, E))
|
||||
|
||||
proc toPreserveHook*(`retract`: Retract; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("retract"), toPreserve(`retract`.`handle`, E))
|
||||
|
||||
proc `message`*[E = void](`body`: Assertion | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Message``.
|
||||
initRecord[E](symbol[E]("message"), toPreserve(`body`, E))
|
||||
|
||||
proc toPreserveHook*(`message`: Message; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("message"), toPreserve(`message`.`body`, E))
|
||||
|
||||
proc `sync`*[E = void](`peer`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Sync``.
|
||||
initRecord[E](symbol[E]("sync"), toPreserve(`peer`, E))
|
||||
|
||||
proc toPreserveHook*(`sync`: Sync; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("sync"), toPreserve(`sync`.`peer`, E))
|
||||
|
||||
proc `$`*[E](x: Packet[E] | Error[E] | Assertion[E] | Handle | Event[E] | Oid |
|
||||
Turn[E] |
|
||||
TurnEvent[E] |
|
||||
Assert[E] |
|
||||
Retract |
|
||||
Message[E] |
|
||||
Sync): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Packet[E] | Error[E] | Assertion[E] | Handle | Event[E] |
|
||||
Oid |
|
||||
Turn[E] |
|
||||
TurnEvent[E] |
|
||||
Assert[E] |
|
||||
Retract |
|
||||
Message[E] |
|
||||
Sync): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,25 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
RacketEvent*[E = void] {.record: "racket-event".} = ref object ## ``<racket-event @source #!any @event #!any>``
|
||||
`source`*: Preserve[E]
|
||||
`event`*: Preserve[E]
|
||||
|
||||
proc `racketEvent`*[E = void](`source`: Preserve[E]; `event`: Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``RacketEvent``.
|
||||
initRecord[E](symbol[E]("racket-event"), toPreserve(`source`, E),
|
||||
toPreserve(`event`, E))
|
||||
|
||||
proc toPreserveHook*(`racketevent`: RacketEvent; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("racket-event"),
|
||||
toPreserve(`racketevent`.`source`, E),
|
||||
toPreserve(`racketevent`.`event`, E))
|
||||
|
||||
proc `$`*[E](x: RacketEvent[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: RacketEvent[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -1,14 +0,0 @@
|
|||
´³bundle·µ³tcp„´³schema·³version‘³definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³ TcpRemote´³rec´³lit³
|
||||
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³timer„´³schema·³version‘³definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³msecs´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
|
||||
later-than„´³tupleµ´³named³msecs´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³TimerExpired´³rec´³lit³
timer-expired„´³tupleµ´³named³label³any„´³named³msecs´³atom³Double„„„„„„³embeddedType€„„µ³stream„´³schema·³version‘³definitions·³Mode´³orµµ±bytes´³lit³bytes„„µ±lines´³refµ„³LineMode„„µ±packet´³rec´³lit³packet„´³tupleµ´³named³size´³atom³
SignedInteger„„„„„„µ±object´³rec´³lit³object„´³tupleµ´³named³description³any„„„„„„„³Sink´³orµµ±source´³rec´³lit³source„´³tupleµ´³named³
|
||||
controller´³embedded´³refµ„³Source„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±data´³rec´³lit³data„´³tupleµ´³named³payload³any„´³named³mode´³refµ„³Mode„„„„„„µ±eof´³rec´³lit³eof„´³tupleµ„„„„„„³Source´³orµµ±sink´³rec´³lit³sink„´³tupleµ´³named³
|
||||
controller´³embedded´³refµ„³Sink„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±credit´³rec´³lit³credit„´³tupleµ´³named³amount´³refµ„³CreditAmount„„´³named³mode´³refµ„³Mode„„„„„„„„³LineMode´³orµµ±lf´³lit³lf„„µ±crlf´³lit³crlf„„„„³StreamError´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„„„„³CreditAmount´³orµµ±count´³atom³
SignedInteger„„µ± unbounded´³lit³ unbounded„„„„³StreamConnection´³rec´³lit³stream-connection„´³tupleµ´³named³source´³embedded´³refµ„³Source„„„´³named³sink´³embedded´³refµ„³Sink„„„´³named³spec³any„„„„³StreamListenerError´³rec´³lit³stream-listener-error„´³tupleµ´³named³spec³any„´³named³message´³atom³String„„„„„³StreamListenerReady´³rec´³lit³stream-listener-ready„´³tupleµ´³named³spec³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³sturdy„´³schema·³version‘³definitions·³Lit´³rec´³lit³lit„´³tupleµ´³named³value³any„„„„³Oid´³atom³
SignedInteger„³Alts´³rec´³lit³or„´³tupleµ´³named³alternatives´³seqof´³refµ„³Rewrite„„„„„„³CArr´³rec´³lit³arr„´³tupleµ´³named³arity´³atom³
SignedInteger„„„„„³CRec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³arity´³atom³
SignedInteger„„„„„³PAnd´³rec´³lit³and„´³tupleµ´³named³patterns´³seqof´³refµ„³Pattern„„„„„„³PNot´³rec´³lit³not„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³TRef´³rec´³lit³ref„´³tupleµ´³named³binding´³atom³
SignedInteger„„„„„³CDict´³rec´³lit³dict„´³tupleµ„„„³PAtom´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ±
SignedInteger´³lit³
SignedInteger„„µ±String´³lit³String„„µ±
|
||||
ByteString´³lit³
|
||||
ByteString„„µ±Symbol´³lit³Symbol„„„„³PBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Caveat´³orµµ±Rewrite´³refµ„³Rewrite„„µ±Alts´³refµ„³Alts„„„„³Pattern´³orµµ±PDiscard´³refµ„³PDiscard„„µ±PAtom´³refµ„³PAtom„„µ± PEmbedded´³refµ„³ PEmbedded„„µ±PBind´³refµ„³PBind„„µ±PAnd´³refµ„³PAnd„„µ±PNot´³refµ„³PNot„„µ±Lit´³refµ„³Lit„„µ± PCompound´³refµ„³ PCompound„„„„³Rewrite´³rec´³lit³rewrite„´³tupleµ´³named³pattern´³refµ„³Pattern„„´³named³template´³refµ„³Template„„„„„³WireRef´³orµµ±mine´³tupleµ´³lit<69>„´³named³oid´³refµ„³Oid„„„„„µ±yours´³tuplePrefixµ´³lit‘„´³named³oid´³refµ„³Oid„„„´³named³attenuation´³seqof´³refµ„³Caveat„„„„„„„³PDiscard´³rec´³lit³_„´³tupleµ„„„³Template´³orµµ±
|
||||
TAttenuate´³refµ„³
|
||||
TAttenuate„„µ±TRef´³refµ„³TRef„„µ±Lit´³refµ„³Lit„„µ± TCompound´³refµ„³ TCompound„„„„³ PCompound´³rec´³lit³compound„´³tupleµ´³named³ctor´³refµ„³ConstructorSpec„„´³named³members´³refµ„³PCompoundMembers„„„„„³ PEmbedded´³lit³Embedded„³ SturdyRef´³rec´³lit³ref„´³tupleµ´³named³oid³any„´³named³caveatChain´³seqof´³refµ„³Attenuation„„„´³named³sig´³atom³
|
||||
ByteString„„„„„³ TCompound´³rec´³lit³compound„´³tupleµ´³named³ctor´³refµ„³ConstructorSpec„„´³named³members´³refµ„³TCompoundMembers„„„„„³
|
||||
TAttenuate´³rec´³lit³ attenuate„´³tupleµ´³named³template´³refµ„³Template„„´³named³attenuation´³refµ„³Attenuation„„„„„³Attenuation´³seqof´³refµ„³Caveat„„³ConstructorSpec´³orµµ±CRec´³refµ„³CRec„„µ±CArr´³refµ„³CArr„„µ±CDict´³refµ„³CDict„„„„³PCompoundMembers´³dictof³any´³refµ„³Pattern„„³TCompoundMembers´³dictof³any´³refµ„³Template„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³worker„´³schema·³version‘³definitions·³Instance´³rec´³lit³Instance„´³tupleµ´³named³name´³atom³String„„´³named³argument³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³service„´³schema·³version‘³definitions·³RequireService´³rec´³lit³require-service„´³tupleµ´³named³serviceName³any„„„„³ServiceRunning´³rec´³lit³service-running„´³tupleµ´³named³serviceName³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³ dataspace„´³schema·³version‘³definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³
|
||||
gatekeeper„´³schema·³version‘³definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³oid³any„´³named³key´³atom³
|
||||
ByteString„„´³named³target´³embedded³any„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³ sturdyref´³refµ³sturdy„³ SturdyRef„„´³named³observer´³embedded´³embedded³any„„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³racketEvent„´³schema·³version‘³definitions·³RacketEvent´³rec´³lit³racket-event„´³tupleµ´³named³source´³embedded³any„„´³named³event´³embedded³any„„„„„„³embeddedType€„„µ³genericProtocol„´³schema·³version‘³definitions·³Oid´³atom³
SignedInteger„³Sync´³rec´³lit³sync„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³
SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„„„³Message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³embeddedType€„„µ³externalProtocol„´³schema·³version‘³definitions·³Oid´³atom³
SignedInteger„³Sync´³rec´³lit³sync„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³
SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„„„³Message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³embeddedType´³refµ³sturdy„³WireRef„„„µ³internalProtocol„´³schema·³version‘³definitions·³Oid´³atom³
SignedInteger„³Sync´³rec´³lit³sync„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³
SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„„„³Message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version‘³definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³embeddedType€„„µ³dataspacePatterns„´³schema·³version‘³definitions·³CArr´³rec´³lit³arr„´³tupleµ´³named³arity´³atom³
SignedInteger„„„„„³CRec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³arity´³atom³
SignedInteger„„„„„³DLit´³rec´³lit³lit„´³tupleµ´³named³value³any„„„„³CDict´³rec´³lit³dict„´³tupleµ„„„³DBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Pattern´³orµµ±DDiscard´³refµ„³DDiscard„„µ±DBind´³refµ„³DBind„„µ±DLit´³refµ„³DLit„„µ± DCompound´³refµ„³ DCompound„„„„³DDiscard´³rec´³lit³_„´³tupleµ„„„³ DCompound´³orµµ±rec´³rec´³lit³compound„´³tupleµ´³named³ctor´³refµ„³CRec„„´³named³members´³dictof´³atom³
SignedInteger„´³refµ„³Pattern„„„„„„„µ±arr´³rec´³lit³compound„´³tupleµ´³named³ctor´³refµ„³CArr„„´³named³members´³dictof´³atom³
SignedInteger„´³refµ„³Pattern„„„„„„„µ±dict´³rec´³lit³compound„´³tupleµ´³named³ctor´³refµ„³CDict„„´³named³members´³dictof³any´³refµ„³Pattern„„„„„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³secureChatProtocol„´³schema·³version‘³definitions·³Join´³rec´³lit³
|
||||
joinedUser„´³tupleµ´³named³uid´³refµ„³UserId„„´³named³handle´³embedded´³refµ„³Session„„„„„„³Says´³rec´³lit³says„´³tupleµ´³named³who´³refµ„³UserId„„´³named³what´³atom³String„„„„„³UserId´³atom³
SignedInteger„³Session´³orµµ±observeUsers´³rec´³lit³Observe„´³tupleµ´³lit³user„´³named³observer´³embedded´³refµ„³UserInfo„„„„„„„µ±
observeSpeech´³rec´³lit³Observe„´³tupleµ´³lit³says„´³named³observer´³embedded´³refµ„³Says„„„„„„„µ± NickClaim´³refµ„³ NickClaim„„µ±Says´³refµ„³Says„„„„³UserInfo´³rec´³lit³user„´³tupleµ´³named³uid´³refµ„³UserId„„´³named³name´³atom³String„„„„„³ NickClaim´³rec´³lit³ claimNick„´³tupleµ´³named³uid´³refµ„³UserId„„´³named³name´³atom³String„„´³named³k´³embedded´³refµ„³NickClaimResponse„„„„„„³NickConflict´³rec´³lit³nickConflict„´³tupleµ„„„³NickClaimResponse´³orµµ±true´³lit<69>„„µ±NickConflict´³refµ„³NickConflict„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³simpleChatProtocol„´³schema·³version‘³definitions·³Says´³rec´³lit³Says„´³tupleµ´³named³who´³atom³String„„´³named³what´³atom³String„„„„„³Present´³rec´³lit³Present„´³tupleµ´³named³username´³atom³String„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„„„
|
|
@ -1,2 +0,0 @@
|
|||
type Cap* = object
|
||||
discard
|
|
@ -1,5 +0,0 @@
|
|||
PRESERVES_SRC_DIR = ../../../../preserves/src
|
||||
|
||||
: $(PRESERVES_SRC_DIR)/preserves/private/preserves_schema_nim.nim |> nim c -o:%o %f |> preserves_schema_nim
|
||||
|
||||
: foreach *.prs | preserves_schema_nim |> ./preserves_schema_nim %f; nim check --path:$(PRESERVES_SRC_DIR) %o |> %B.nim {gen}
|
|
@ -1,4 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
Observe = <Observe @pattern dataspacePatterns.Pattern @observer #!any>.
|
|
@ -1,16 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
; Dataspace patterns: a sublanguage of attenuation patterns.
|
||||
Pattern = DDiscard / DBind / DLit / DCompound .
|
||||
|
||||
DDiscard = <_>.
|
||||
DBind = <bind @pattern Pattern>.
|
||||
DLit = <lit @value any>.
|
||||
DCompound = @rec <compound @ctor CRec @members { int: Pattern ...:... }>
|
||||
/ @arr <compound @ctor CArr @members { int: Pattern ...:... }>
|
||||
/ @dict <compound @ctor CDict @members { any: Pattern ...:... }> .
|
||||
|
||||
CRec = <rec @label any @arity int>.
|
||||
CArr = <arr @arity int>.
|
||||
CDict = <dict>.
|
|
@ -1,3 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType sturdy.WireRef .
|
||||
include "genericProtocol.prs".
|
|
@ -1,5 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
Resolve = <resolve @sturdyref sturdy.SturdyRef @observer #!#!any>.
|
||||
Bind = <bind @oid any @key bytes @target #!any>.
|
|
@ -1,17 +0,0 @@
|
|||
version 1 .
|
||||
|
||||
Packet = Turn / Error .
|
||||
|
||||
Error = <error @message string @detail any>.
|
||||
|
||||
Assertion = any .
|
||||
Handle = int .
|
||||
Event = Assert / Retract / Message / Sync .
|
||||
Oid = int .
|
||||
Turn = [TurnEvent ...].
|
||||
TurnEvent = [@oid Oid @event Event].
|
||||
|
||||
Assert = <assert @assertion Assertion @handle Handle>.
|
||||
Retract = <retract @handle Handle>.
|
||||
Message = <message @body Assertion>.
|
||||
Sync = <sync @peer #!#t>.
|
|
@ -1,3 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
include "genericProtocol.prs".
|
|
@ -1,3 +0,0 @@
|
|||
version 1 .
|
||||
|
||||
RacketEvent = <racket-event @source #!any @event #!any>.
|
|
@ -1,21 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
UserId = int .
|
||||
|
||||
Join = <joinedUser @uid UserId @handle #!Session>.
|
||||
|
||||
Session = @observeUsers <Observe =user @observer #!UserInfo>
|
||||
/ @observeSpeech <Observe =says @observer #!Says>
|
||||
/ NickClaim
|
||||
/ Says
|
||||
.
|
||||
|
||||
NickClaim = <claimNick @uid UserId @name string @k #!NickClaimResponse>.
|
||||
NickClaimResponse = #t / NickConflict .
|
||||
|
||||
UserInfo = <user @uid UserId @name string>.
|
||||
|
||||
Says = <says @who UserId @what string>.
|
||||
|
||||
NickConflict = <nickConflict>.
|
|
@ -1,5 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
RequireService = <require-service @serviceName any>.
|
||||
ServiceRunning = <service-running @serviceName any>.
|
|
@ -1,5 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
Present = <Present @username string>.
|
||||
Says = <Says @who string @what string>.
|
|
@ -1,38 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
; Assertion:
|
||||
StreamConnection = <stream-connection @source #!Source @sink #!Sink @spec any>.
|
||||
|
||||
; Assertions:
|
||||
StreamListenerReady = <stream-listener-ready @spec any>.
|
||||
StreamListenerError = <stream-listener-error @spec any @message string>.
|
||||
|
||||
; Assertion:
|
||||
StreamError = <error @message string>.
|
||||
|
||||
Source =
|
||||
; Assertions:
|
||||
/ <sink @controller #!Sink>
|
||||
/ StreamError
|
||||
|
||||
; Messages:
|
||||
/ <credit @amount CreditAmount @mode Mode>
|
||||
.
|
||||
|
||||
Sink =
|
||||
; Assertions:
|
||||
/ <source @controller #!Source>
|
||||
/ StreamError
|
||||
|
||||
; Messages:
|
||||
/ <data @payload any @mode Mode>
|
||||
/ <eof>
|
||||
.
|
||||
|
||||
; Value:
|
||||
CreditAmount = @count int / @unbounded =unbounded .
|
||||
|
||||
; Value:
|
||||
Mode = =bytes / @lines LineMode / <packet @size int> / <object @description any>.
|
||||
LineMode = =lf / =crlf .
|
|
@ -1,44 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
; Each Attenuation is a stage. The sequence of Attenuations is run RIGHT-TO-LEFT.
|
||||
; That is, the newest Attenuations are at the right.
|
||||
SturdyRef = <ref @oid any @caveatChain [Attenuation ...] @sig bytes>.
|
||||
|
||||
; An individual Attenuation is run RIGHT-TO-LEFT.
|
||||
; That is, the newest Caveats are at the right.
|
||||
Attenuation = [Caveat ...].
|
||||
|
||||
; embodies 1st-party caveats over assertion structure, but nothing else
|
||||
; can add 3rd-party caveats and richer predicates later
|
||||
Caveat = Rewrite / Alts .
|
||||
Rewrite = <rewrite @pattern Pattern @template Template>.
|
||||
Alts = <or @alternatives [Rewrite ...]>.
|
||||
|
||||
Oid = int .
|
||||
WireRef = @mine [0 @oid Oid] / @yours [1 @oid Oid @attenuation Caveat ...].
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
|
||||
ConstructorSpec = CRec / CArr / CDict .
|
||||
CRec = <rec @label any @arity int>.
|
||||
CArr = <arr @arity int>.
|
||||
CDict = <dict>.
|
||||
|
||||
Lit = <lit @value any>.
|
||||
|
||||
Pattern = PDiscard / PAtom / PEmbedded / PBind / PAnd / PNot / Lit / PCompound .
|
||||
PDiscard = <_>.
|
||||
PAtom = =Boolean / =Float / =Double / =SignedInteger / =String / =ByteString / =Symbol .
|
||||
PEmbedded = =Embedded .
|
||||
PBind = <bind @pattern Pattern>.
|
||||
PAnd = <and @patterns [Pattern ...]>.
|
||||
PNot = <not @pattern Pattern>.
|
||||
PCompound = <compound @ctor ConstructorSpec @members PCompoundMembers>.
|
||||
PCompoundMembers = { any: Pattern ...:... }.
|
||||
|
||||
Template = TAttenuate / TRef / Lit / TCompound .
|
||||
TAttenuate = <attenuate @template Template @attenuation Attenuation>.
|
||||
TRef = <ref @binding int>.
|
||||
TCompound = <compound @ctor ConstructorSpec @members TCompoundMembers>.
|
||||
TCompoundMembers = { any: Template ...:... }.
|
|
@ -1,7 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
TcpRemote = <tcp-remote @host string @port int>.
|
||||
TcpLocal = <tcp-local @host string @port int>.
|
||||
|
||||
TcpPeerInfo = <tcp-peer @handle #!any @local TcpLocal @remote TcpRemote>.
|
|
@ -1,7 +0,0 @@
|
|||
version 1 .
|
||||
|
||||
SetTimer = <set-timer @label any @msecs double @kind TimerKind>.
|
||||
TimerExpired = <timer-expired @label any @msecs double>.
|
||||
TimerKind = =relative / =absolute / =clear .
|
||||
|
||||
LaterThan = <later-than @msecs double>.
|
|
@ -1,6 +0,0 @@
|
|||
version 1 .
|
||||
|
||||
Tcp = <tcp @host string @port int>.
|
||||
Unix = <unix @path string>.
|
||||
WebSocket = <ws @url string>.
|
||||
Stdio = <stdio>.
|
|
@ -1,4 +0,0 @@
|
|||
version 1 .
|
||||
embeddedType EntityRef.Cap .
|
||||
|
||||
Instance = <Instance @name string @argument any>.
|
|
@ -0,0 +1,161 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
UserId* = distinct BiggestInt ## ``int``
|
||||
Join* {.record: "joinedUser".} = ref object ## ``<joinedUser @uid UserId @handle #!Session>``
|
||||
`uid`*: UserId
|
||||
`handle`*: Session
|
||||
|
||||
SessionKind* {.pure.} = enum
|
||||
`observeusers`, `observespeech`, `Nickclaim`, `Says`
|
||||
Sessionobserveusers* {.record: "Observe".} = ref object
|
||||
`user`*: string
|
||||
`observer`*: UserInfo
|
||||
|
||||
Sessionobservespeech* {.record: "Observe".} = ref object
|
||||
`says`*: string
|
||||
`observer`*: Says
|
||||
|
||||
Session* = ref object ## ``/ <Observe <<lit>user> @observer #!UserInfo> / <Observe <<lit>says> @observer #!Says> / NickClaim / Says``
|
||||
case kind*: SessionKind
|
||||
of SessionKind.`observeusers`:
|
||||
`observeusers`*: Sessionobserveusers
|
||||
|
||||
of SessionKind.`observespeech`:
|
||||
`observespeech`*: Sessionobservespeech
|
||||
|
||||
of SessionKind.`Nickclaim`:
|
||||
`nickclaim`*: NickClaim
|
||||
|
||||
of SessionKind.`Says`:
|
||||
`says`*: Says
|
||||
|
||||
|
||||
NickClaim* {.record: "claimNick".} = ref object ## ``<claimNick @uid UserId @name string @k #!NickClaimResponse>``
|
||||
`uid`*: UserId
|
||||
`name`*: string
|
||||
`k`*: NickClaimResponse
|
||||
|
||||
NickclaimresponseKind* {.pure.} = enum
|
||||
`true`, `Nickconflict`
|
||||
NickClaimResponsetrue* = bool
|
||||
NickClaimResponse* = ref object ## ``/ =#t / NickConflict``
|
||||
case kind*: NickclaimresponseKind
|
||||
of NickclaimresponseKind.`true`:
|
||||
discard
|
||||
|
||||
of NickclaimresponseKind.`Nickconflict`:
|
||||
`nickconflict`*: NickConflict
|
||||
|
||||
|
||||
UserInfo* {.record: "user".} = ref object ## ``<user @uid UserId @name string>``
|
||||
`uid`*: UserId
|
||||
`name`*: string
|
||||
|
||||
Says* {.record: "says".} = ref object ## ``<says @who UserId @what string>``
|
||||
`who`*: UserId
|
||||
`what`*: string
|
||||
|
||||
NickConflict* {.record: "nickConflict".} = object ## ``<nickConflict>``
|
||||
discard
|
||||
|
||||
proc `join`*[E = void](`uid`: UserId | Preserve[E]; `handle`: Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``Join``.
|
||||
initRecord[E](symbol[E]("joinedUser"), toPreserve(`uid`, E),
|
||||
toPreserve(`handle`, E))
|
||||
|
||||
proc toPreserveHook*(`join`: Join; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("joinedUser"), toPreserve(`join`.`uid`, E),
|
||||
toPreserve(`join`.`handle`, E))
|
||||
|
||||
proc toPreserveHook*(v: Session; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of SessionKind.`observeusers`:
|
||||
toPreserve(v.`observeusers`, E)
|
||||
of SessionKind.`observespeech`:
|
||||
toPreserve(v.`observespeech`, E)
|
||||
of SessionKind.`Nickclaim`:
|
||||
toPreserve(v.`nickclaim`, E)
|
||||
of SessionKind.`Says`:
|
||||
toPreserve(v.`says`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Session; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("observeUsers"):
|
||||
v = Session(kind: SessionKind.`observeusers`)
|
||||
result = fromPreserve(v.`observeusers`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("observeSpeech"):
|
||||
v = Session(kind: SessionKind.`observespeech`)
|
||||
result = fromPreserve(v.`observespeech`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("NickClaim"):
|
||||
v = Session(kind: SessionKind.`Nickclaim`)
|
||||
result = fromPreserve(v.`nickclaim`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Says"):
|
||||
v = Session(kind: SessionKind.`Says`)
|
||||
result = fromPreserve(v.`says`, pr)
|
||||
|
||||
proc `nickClaim`*[E = void](`uid`: UserId | Preserve[E];
|
||||
`name`: string | Preserve[E]; `k`: Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``NickClaim``.
|
||||
initRecord[E](symbol[E]("claimNick"), toPreserve(`uid`, E),
|
||||
toPreserve(`name`, E), toPreserve(`k`, E))
|
||||
|
||||
proc toPreserveHook*(`nickclaim`: NickClaim; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("claimNick"), toPreserve(`nickclaim`.`uid`, E),
|
||||
toPreserve(`nickclaim`.`name`, E),
|
||||
toPreserve(`nickclaim`.`k`, E))
|
||||
|
||||
proc toPreserveHook*(v: NickClaimResponse; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of NickClaimResponseKind.`true`:
|
||||
Preserve[E](kind: pkBoolean, bool: true)
|
||||
of NickClaimResponseKind.`Nickconflict`:
|
||||
toPreserve(v.`nickconflict`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var NickClaimResponse; pr: Preserve[E]): bool =
|
||||
if pr.kind == pkBoolean and pr.bool == true:
|
||||
v = NickClaimResponse(kind: NickClaimResponseKind.`true`)
|
||||
result = true
|
||||
elif isRecord(pr) and pr.label.isSymbol("NickConflict"):
|
||||
v = NickClaimResponse(kind: NickClaimResponseKind.`Nickconflict`)
|
||||
result = fromPreserve(v.`nickconflict`, pr)
|
||||
|
||||
proc `userInfo`*[E = void](`uid`: UserId | Preserve[E];
|
||||
`name`: string | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``UserInfo``.
|
||||
initRecord[E](symbol[E]("user"), toPreserve(`uid`, E), toPreserve(`name`, E))
|
||||
|
||||
proc toPreserveHook*(`userinfo`: UserInfo; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("user"), toPreserve(`userinfo`.`uid`, E),
|
||||
toPreserve(`userinfo`.`name`, E))
|
||||
|
||||
proc `says`*[E = void](`who`: UserId | Preserve[E]; `what`: string | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``Says``.
|
||||
initRecord[E](symbol[E]("says"), toPreserve(`who`, E), toPreserve(`what`, E))
|
||||
|
||||
proc toPreserveHook*(`says`: Says; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("says"), toPreserve(`says`.`who`, E),
|
||||
toPreserve(`says`.`what`, E))
|
||||
|
||||
proc `nickConflict`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``NickConflict``.
|
||||
initRecord[E](symbol[E]("nickConflict"))
|
||||
|
||||
proc toPreserveHook*(`nickconflict`: NickConflict; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("nickConflict"))
|
||||
|
||||
proc `$`*[E](x: UserId | Join | Session | NickClaim | NickClaimResponse |
|
||||
UserInfo |
|
||||
Says |
|
||||
NickConflict): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: UserId | Join | Session | NickClaim | NickClaimResponse |
|
||||
UserInfo |
|
||||
Says |
|
||||
NickConflict): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,121 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
RequireService*[E = void] {.record: "require-service".} = ref object ## ``<require-service @serviceName any>``
|
||||
`serviceName`*: Preserve[E]
|
||||
|
||||
RunService*[E = void] {.record: "run-service".} = ref object ## ``<run-service @serviceName any>``
|
||||
`serviceName`*: Preserve[E]
|
||||
|
||||
ServiceStarted*[E = void] {.record: "service-started".} = ref object ## ``<service-started @serviceName any>``
|
||||
`serviceName`*: Preserve[E]
|
||||
|
||||
ServiceRunning*[E = void] {.record: "service-running".} = ref object ## ``<service-running @serviceName any>``
|
||||
`serviceName`*: Preserve[E]
|
||||
|
||||
ServiceDependency*[E = void] {.record: "depends-on".} = ref object ## ``<depends-on @depender any @dependee Dependee>``
|
||||
`depender`*: Preserve[E]
|
||||
`dependee`*: Dependee[E]
|
||||
|
||||
DependeeKind* {.pure.} = enum
|
||||
`Servicestarted`, `Servicerunning`
|
||||
Dependee*[E = void] = ref object ## ``/ ServiceStarted / ServiceRunning``
|
||||
case kind*: DependeeKind
|
||||
of DependeeKind.`Servicestarted`:
|
||||
`servicestarted`*: ServiceStarted[E]
|
||||
|
||||
of DependeeKind.`Servicerunning`:
|
||||
`servicerunning`*: ServiceRunning[E]
|
||||
|
||||
|
||||
ServiceMilestone*[E = void] {.record: "service-milestone".} = ref object ## ``<service-milestone @serviceName any @milestone any>``
|
||||
`serviceName`*: Preserve[E]
|
||||
`milestone`*: Preserve[E]
|
||||
|
||||
proc `requireService`*[E = void](`serviceName`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``RequireService``.
|
||||
initRecord[E](symbol[E]("require-service"), toPreserve(`serviceName`, E))
|
||||
|
||||
proc toPreserveHook*(`requireservice`: RequireService; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("require-service"),
|
||||
toPreserve(`requireservice`.`serviceName`, E))
|
||||
|
||||
proc `runService`*[E = void](`serviceName`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``RunService``.
|
||||
initRecord[E](symbol[E]("run-service"), toPreserve(`serviceName`, E))
|
||||
|
||||
proc toPreserveHook*(`runservice`: RunService; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("run-service"),
|
||||
toPreserve(`runservice`.`serviceName`, E))
|
||||
|
||||
proc `serviceStarted`*[E = void](`serviceName`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``ServiceStarted``.
|
||||
initRecord[E](symbol[E]("service-started"), toPreserve(`serviceName`, E))
|
||||
|
||||
proc toPreserveHook*(`servicestarted`: ServiceStarted; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("service-started"),
|
||||
toPreserve(`servicestarted`.`serviceName`, E))
|
||||
|
||||
proc `serviceRunning`*[E = void](`serviceName`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``ServiceRunning``.
|
||||
initRecord[E](symbol[E]("service-running"), toPreserve(`serviceName`, E))
|
||||
|
||||
proc toPreserveHook*(`servicerunning`: ServiceRunning; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("service-running"),
|
||||
toPreserve(`servicerunning`.`serviceName`, E))
|
||||
|
||||
proc `serviceDependency`*[E = void](`depender`: Preserve[E];
|
||||
`dependee`: Dependee | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``ServiceDependency``.
|
||||
initRecord[E](symbol[E]("depends-on"), toPreserve(`depender`, E),
|
||||
toPreserve(`dependee`, E))
|
||||
|
||||
proc toPreserveHook*(`servicedependency`: ServiceDependency; E: typedesc): Preserve[
|
||||
E] =
|
||||
initRecord[E](symbol[E]("depends-on"),
|
||||
toPreserve(`servicedependency`.`depender`, E),
|
||||
toPreserve(`servicedependency`.`dependee`, E))
|
||||
|
||||
proc toPreserveHook*(v: Dependee; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of DependeeKind.`Servicestarted`:
|
||||
toPreserve(v.`servicestarted`, E)
|
||||
of DependeeKind.`Servicerunning`:
|
||||
toPreserve(v.`servicerunning`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Dependee; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("ServiceStarted"):
|
||||
v = Dependee(kind: DependeeKind.`Servicestarted`)
|
||||
result = fromPreserve(v.`servicestarted`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("ServiceRunning"):
|
||||
v = Dependee(kind: DependeeKind.`Servicerunning`)
|
||||
result = fromPreserve(v.`servicerunning`, pr)
|
||||
|
||||
proc `serviceMilestone`*[E = void](`serviceName`: Preserve[E];
|
||||
`milestone`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``ServiceMilestone``.
|
||||
initRecord[E](symbol[E]("service-milestone"), toPreserve(`serviceName`, E),
|
||||
toPreserve(`milestone`, E))
|
||||
|
||||
proc toPreserveHook*(`servicemilestone`: ServiceMilestone; E: typedesc): Preserve[
|
||||
E] =
|
||||
initRecord[E](symbol[E]("service-milestone"),
|
||||
toPreserve(`servicemilestone`.`serviceName`, E),
|
||||
toPreserve(`servicemilestone`.`milestone`, E))
|
||||
|
||||
proc `$`*[E](x: RequireService[E] | RunService[E] | ServiceStarted[E] |
|
||||
ServiceRunning[E] |
|
||||
ServiceDependency[E] |
|
||||
Dependee[E] |
|
||||
ServiceMilestone[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: RequireService[E] | RunService[E] | ServiceStarted[E] |
|
||||
ServiceRunning[E] |
|
||||
ServiceDependency[E] |
|
||||
Dependee[E] |
|
||||
ServiceMilestone[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
Present* {.record: "Present".} = ref object ## ``<Present @username string>``
|
||||
`username`*: string
|
||||
|
||||
Says* {.record: "Says".} = ref object ## ``<Says @who string @what string>``
|
||||
`who`*: string
|
||||
`what`*: string
|
||||
|
||||
proc `present`*[E = void](`username`: string | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Present``.
|
||||
initRecord[E](symbol[E]("Present"), toPreserve(`username`, E))
|
||||
|
||||
proc toPreserveHook*(`present`: Present; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("Present"), toPreserve(`present`.`username`, E))
|
||||
|
||||
proc `says`*[E = void](`who`: string | Preserve[E]; `what`: string | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``Says``.
|
||||
initRecord[E](symbol[E]("Says"), toPreserve(`who`, E), toPreserve(`what`, E))
|
||||
|
||||
proc toPreserveHook*(`says`: Says; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("Says"), toPreserve(`says`.`who`, E),
|
||||
toPreserve(`says`.`what`, E))
|
||||
|
||||
proc `$`*[E](x: Present | Says): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Present | Says): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,268 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
StreamConnection*[E = void] {.record: "stream-connection".} = ref object ## ``<stream-connection @source #!Source @sink #!Sink @spec any>``
|
||||
`source`*: Source[E]
|
||||
`sink`*: Sink[E]
|
||||
`spec`*: Preserve[E]
|
||||
|
||||
StreamListenerReady*[E = void] {.record: "stream-listener-ready".} = ref object ## ``<stream-listener-ready @spec any>``
|
||||
`spec`*: Preserve[E]
|
||||
|
||||
StreamListenerError*[E = void] {.record: "stream-listener-error".} = ref object ## ``<stream-listener-error @spec any @message string>``
|
||||
`spec`*: Preserve[E]
|
||||
`message`*: string
|
||||
|
||||
StreamError* {.record: "error".} = ref object ## ``<error @message string>``
|
||||
`message`*: string
|
||||
|
||||
SourceKind* {.pure.} = enum
|
||||
`sink`, `Streamerror`, `credit`
|
||||
Sourcesink*[E = void] {.record: "sink".} = ref object
|
||||
`controller`*: Sink[E]
|
||||
|
||||
Sourcecredit*[E = void] {.record: "credit".} = ref object
|
||||
`amount`*: CreditAmount
|
||||
`mode`*: Mode[E]
|
||||
|
||||
Source*[E = void] = ref object ## ``/ <sink @controller #!Sink> / StreamError / <credit @amount CreditAmount @mode Mode>``
|
||||
case kind*: SourceKind
|
||||
of SourceKind.`sink`:
|
||||
`sink`*: Preserve[E]
|
||||
|
||||
of SourceKind.`Streamerror`:
|
||||
`streamerror`*: StreamError
|
||||
|
||||
of SourceKind.`credit`:
|
||||
`credit`*: Sourcecredit[E]
|
||||
|
||||
|
||||
SinkKind* {.pure.} = enum
|
||||
`source`, `Streamerror`, `data`, `eof`
|
||||
Sinksource*[E = void] {.record: "source".} = ref object
|
||||
`controller`*: Source[E]
|
||||
|
||||
Sinkdata*[E = void] {.record: "data".} = ref object
|
||||
`payload`*: Preserve[E]
|
||||
`mode`*: Mode[E]
|
||||
|
||||
Sinkeof* {.record: "eof".} = object
|
||||
discard
|
||||
|
||||
Sink*[E = void] = ref object ## ``/ <source @controller #!Source> / StreamError / <data @payload any @mode Mode> / <eof>``
|
||||
case kind*: SinkKind
|
||||
of SinkKind.`source`:
|
||||
`source`*: Preserve[E]
|
||||
|
||||
of SinkKind.`Streamerror`:
|
||||
`streamerror`*: StreamError
|
||||
|
||||
of SinkKind.`data`:
|
||||
`data`*: Sinkdata[E]
|
||||
|
||||
of SinkKind.`eof`:
|
||||
`eof`*: Sinkeof
|
||||
|
||||
|
||||
CreditamountKind* {.pure.} = enum
|
||||
`count`, `unbounded`
|
||||
CreditAmountcount* = BiggestInt
|
||||
CreditAmountunbounded* = string
|
||||
CreditAmount* = ref object ## ``/ @count int / =<<lit>unbounded>``
|
||||
case kind*: CreditamountKind
|
||||
of CreditamountKind.`count`:
|
||||
`count`*: CreditAmountcount
|
||||
|
||||
of CreditamountKind.`unbounded`:
|
||||
discard
|
||||
|
||||
|
||||
ModeKind* {.pure.} = enum
|
||||
`bytes`, `lines`, `packet`, `object`
|
||||
Modebytes* = string
|
||||
Modepacket* {.record: "packet".} = ref object
|
||||
`size`*: BiggestInt
|
||||
|
||||
Modeobject*[E = void] {.record: "object".} = ref object
|
||||
`description`*: Preserve[E]
|
||||
|
||||
Mode*[E = void] = ref object ## ``/ =<<lit>bytes> / LineMode / <packet @size int> / <object @description any>``
|
||||
case kind*: ModeKind
|
||||
of ModeKind.`bytes`:
|
||||
discard
|
||||
|
||||
of ModeKind.`lines`:
|
||||
`lines`*: LineMode
|
||||
|
||||
of ModeKind.`packet`:
|
||||
`packet`*: BiggestInt
|
||||
|
||||
of ModeKind.`object`:
|
||||
`object`*: Preserve[E]
|
||||
|
||||
|
||||
LineMode* {.pure.} = enum ## ``/ =<<lit>lf> / =<<lit>crlf>``
|
||||
`lf`, `crlf`
|
||||
proc `streamConnection`*[E = void](`source`: Preserve[E]; `sink`: Preserve[E];
|
||||
`spec`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``StreamConnection``.
|
||||
initRecord[E](symbol[E]("stream-connection"), toPreserve(`source`, E),
|
||||
toPreserve(`sink`, E), toPreserve(`spec`, E))
|
||||
|
||||
proc toPreserveHook*(`streamconnection`: StreamConnection; E: typedesc): Preserve[
|
||||
E] =
|
||||
initRecord[E](symbol[E]("stream-connection"),
|
||||
toPreserve(`streamconnection`.`source`, E),
|
||||
toPreserve(`streamconnection`.`sink`, E),
|
||||
toPreserve(`streamconnection`.`spec`, E))
|
||||
|
||||
proc `streamListenerReady`*[E = void](`spec`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``StreamListenerReady``.
|
||||
initRecord[E](symbol[E]("stream-listener-ready"), toPreserve(`spec`, E))
|
||||
|
||||
proc toPreserveHook*(`streamlistenerready`: StreamListenerReady; E: typedesc): Preserve[
|
||||
E] =
|
||||
initRecord[E](symbol[E]("stream-listener-ready"),
|
||||
toPreserve(`streamlistenerready`.`spec`, E))
|
||||
|
||||
proc `streamListenerError`*[E = void](`spec`: Preserve[E];
|
||||
`message`: string | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``StreamListenerError``.
|
||||
initRecord[E](symbol[E]("stream-listener-error"), toPreserve(`spec`, E),
|
||||
toPreserve(`message`, E))
|
||||
|
||||
proc toPreserveHook*(`streamlistenererror`: StreamListenerError; E: typedesc): Preserve[
|
||||
E] =
|
||||
initRecord[E](symbol[E]("stream-listener-error"),
|
||||
toPreserve(`streamlistenererror`.`spec`, E),
|
||||
toPreserve(`streamlistenererror`.`message`, E))
|
||||
|
||||
proc `streamError`*[E = void](`message`: string | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``StreamError``.
|
||||
initRecord[E](symbol[E]("error"), toPreserve(`message`, E))
|
||||
|
||||
proc toPreserveHook*(`streamerror`: StreamError; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("error"), toPreserve(`streamerror`.`message`, E))
|
||||
|
||||
proc toPreserveHook*(v: Source; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of SourceKind.`sink`:
|
||||
toPreserve(v.`sink`, E)
|
||||
of SourceKind.`Streamerror`:
|
||||
toPreserve(v.`streamerror`, E)
|
||||
of SourceKind.`credit`:
|
||||
toPreserve(v.`credit`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Source; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("sink"):
|
||||
v = Source(kind: SourceKind.`sink`)
|
||||
result = fromPreserve(v.`sink`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("StreamError"):
|
||||
v = Source(kind: SourceKind.`Streamerror`)
|
||||
result = fromPreserve(v.`streamerror`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("credit"):
|
||||
v = Source(kind: SourceKind.`credit`)
|
||||
result = fromPreserve(v.`credit`, pr)
|
||||
|
||||
proc toPreserveHook*(v: Sink; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of SinkKind.`source`:
|
||||
toPreserve(v.`source`, E)
|
||||
of SinkKind.`Streamerror`:
|
||||
toPreserve(v.`streamerror`, E)
|
||||
of SinkKind.`data`:
|
||||
toPreserve(v.`data`, E)
|
||||
of SinkKind.`eof`:
|
||||
toPreserve(v.`eof`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Sink; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("source"):
|
||||
v = Sink(kind: SinkKind.`source`)
|
||||
result = fromPreserve(v.`source`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("StreamError"):
|
||||
v = Sink(kind: SinkKind.`Streamerror`)
|
||||
result = fromPreserve(v.`streamerror`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("data"):
|
||||
v = Sink(kind: SinkKind.`data`)
|
||||
result = fromPreserve(v.`data`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("eof"):
|
||||
v = Sink(kind: SinkKind.`eof`)
|
||||
result = fromPreserve(v.`eof`, pr)
|
||||
|
||||
proc toPreserveHook*(v: CreditAmount; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of CreditAmountKind.`count`:
|
||||
toPreserve(v.`count`, E)
|
||||
of CreditAmountKind.`unbounded`:
|
||||
Preserve[E](kind: pkSymbol, symbol: "unbounded")
|
||||
|
||||
proc fromPreserveHook*[E](v: var CreditAmount; pr: Preserve[E]): bool =
|
||||
if false:
|
||||
discard
|
||||
elif pr.kind == pkSymbol and pr.symbol == "unbounded":
|
||||
v = CreditAmount(kind: CreditAmountKind.`unbounded`)
|
||||
result = true
|
||||
|
||||
proc toPreserveHook*(v: Mode; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of ModeKind.`bytes`:
|
||||
Preserve[E](kind: pkSymbol, symbol: "bytes")
|
||||
of ModeKind.`lines`:
|
||||
toPreserve(v.`lines`, E)
|
||||
of ModeKind.`packet`:
|
||||
toPreserve(v.`packet`, E)
|
||||
of ModeKind.`object`:
|
||||
toPreserve(v.`object`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Mode; pr: Preserve[E]): bool =
|
||||
if pr.kind == pkSymbol and pr.symbol == "bytes":
|
||||
v = Mode(kind: ModeKind.`bytes`)
|
||||
result = true
|
||||
elif false: ## snkOr - / =<<lit>lf> / =<<lit>crlf>
|
||||
discard
|
||||
elif isRecord(pr) and pr.label.isSymbol("packet"):
|
||||
v = Mode(kind: ModeKind.`packet`)
|
||||
result = fromPreserve(v.`packet`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("object"):
|
||||
v = Mode(kind: ModeKind.`object`)
|
||||
result = fromPreserve(v.`object`, pr)
|
||||
|
||||
proc toPreserveHook*(v: LineMode; E: typedesc): Preserve[E] =
|
||||
case v
|
||||
of LineMode.`lf`:
|
||||
symbol[E]("lf")
|
||||
of LineMode.`crlf`:
|
||||
symbol[E]("crlf")
|
||||
|
||||
proc fromPreserveHook*[E](v: var LineMode; pr: Preserve[E]): bool =
|
||||
if isSymbol(pr):
|
||||
case pr.symbol
|
||||
of "lf":
|
||||
v = LineMode.`lf`
|
||||
result = true
|
||||
of "crlf":
|
||||
v = LineMode.`crlf`
|
||||
result = true
|
||||
|
||||
proc `$`*[E](x: StreamConnection[E] | StreamListenerReady[E] |
|
||||
StreamListenerError[E] |
|
||||
StreamError |
|
||||
Source[E] |
|
||||
Sink[E] |
|
||||
CreditAmount |
|
||||
Mode[E] |
|
||||
LineMode): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: StreamConnection[E] | StreamListenerReady[E] |
|
||||
StreamListenerError[E] |
|
||||
StreamError |
|
||||
Source[E] |
|
||||
Sink[E] |
|
||||
CreditAmount |
|
||||
Mode[E] |
|
||||
LineMode): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,494 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves, std/tables, std/tables
|
||||
|
||||
type
|
||||
SturdyRef*[E = void] {.record: "ref".} = ref object ## ``<ref @oid any @caveatChain [ Attenuation ... ] @sig bytes>``
|
||||
`oid`*: Preserve[E]
|
||||
`caveatChain`*: seq[Attenuation[E]]
|
||||
`sig`*: seq[byte]
|
||||
|
||||
Attenuation*[E = void] = seq[Caveat[E]] ## ``[ Caveat ... ]``
|
||||
CaveatKind* {.pure.} = enum
|
||||
`Rewrite`, `Alts`
|
||||
Caveat*[E = void] = ref object ## ``/ Rewrite / Alts``
|
||||
case kind*: CaveatKind
|
||||
of CaveatKind.`Rewrite`:
|
||||
`rewrite`*: Rewrite[E]
|
||||
|
||||
of CaveatKind.`Alts`:
|
||||
`alts`*: Alts[E]
|
||||
|
||||
|
||||
Rewrite*[E = void] {.record: "rewrite".} = ref object ## ``<rewrite @pattern Pattern @template Template>``
|
||||
`pattern`*: Pattern[E]
|
||||
`template`*: Template[E]
|
||||
|
||||
Alts*[E = void] {.record: "or".} = ref object ## ``<or @alternatives [ Rewrite ... ]>``
|
||||
`alternatives`*: seq[Rewrite[E]]
|
||||
|
||||
Oid* = distinct BiggestInt ## ``int``
|
||||
WirerefKind* {.pure.} = enum
|
||||
`mine`, `yours`
|
||||
WireRefmine* = tuple[`0`: BiggestInt, `oid`: Oid]
|
||||
WireRefyours*[E = void] = tuple[`1`: BiggestInt, `oid`: Oid,
|
||||
`attenuation`: seq[Caveat[E]]]
|
||||
WireRef*[E = void] = ref object ## ``/ @mine [0 @oid Oid] / @yours [1 @oid Oid @attenuation Caveat ...]``
|
||||
case kind*: WirerefKind
|
||||
of WirerefKind.`mine`:
|
||||
`mine`*: WireRefmine
|
||||
|
||||
of WirerefKind.`yours`:
|
||||
`yours`*: WireRefyours[E]
|
||||
|
||||
|
||||
ConstructorspecKind* {.pure.} = enum
|
||||
`Crec`, `Carr`, `Cdict`
|
||||
ConstructorSpec*[E = void] = ref object ## ``/ CRec / CArr / CDict``
|
||||
case kind*: ConstructorspecKind
|
||||
of ConstructorspecKind.`Crec`:
|
||||
`crec`*: CRec[E]
|
||||
|
||||
of ConstructorspecKind.`Carr`:
|
||||
`carr`*: CArr
|
||||
|
||||
of ConstructorspecKind.`Cdict`:
|
||||
`cdict`*: CDict
|
||||
|
||||
|
||||
CRec*[E = void] {.record: "rec".} = ref object ## ``<rec @label any @arity int>``
|
||||
`label`*: Preserve[E]
|
||||
`arity`*: BiggestInt
|
||||
|
||||
CArr* {.record: "arr".} = ref object ## ``<arr @arity int>``
|
||||
`arity`*: BiggestInt
|
||||
|
||||
CDict* {.record: "dict".} = object ## ``<dict>``
|
||||
discard
|
||||
|
||||
Lit*[E = void] {.record: "lit".} = ref object ## ``<lit @value any>``
|
||||
`value`*: Preserve[E]
|
||||
|
||||
PatternKind* {.pure.} = enum
|
||||
`Pdiscard`, `Patom`, `Pembedded`, `Pbind`, `Pand`, `Pnot`, `Lit`,
|
||||
`Pcompound`
|
||||
Pattern*[E = void] = ref object ## ``/ PDiscard / PAtom / PEmbedded / PBind / PAnd / PNot / Lit / PCompound``
|
||||
case kind*: PatternKind
|
||||
of PatternKind.`Pdiscard`:
|
||||
`pdiscard`*: PDiscard
|
||||
|
||||
of PatternKind.`Patom`:
|
||||
`patom`*: PAtom
|
||||
|
||||
of PatternKind.`Pembedded`:
|
||||
discard
|
||||
|
||||
of PatternKind.`Pbind`:
|
||||
`pbind`*: PBind[E]
|
||||
|
||||
of PatternKind.`Pand`:
|
||||
`pand`*: PAnd[E]
|
||||
|
||||
of PatternKind.`Pnot`:
|
||||
`pnot`*: PNot[E]
|
||||
|
||||
of PatternKind.`Lit`:
|
||||
`lit`*: Lit[E]
|
||||
|
||||
of PatternKind.`Pcompound`:
|
||||
`pcompound`*: PCompound[E]
|
||||
|
||||
|
||||
PDiscard* {.record: "_".} = object ## ``<_>``
|
||||
discard
|
||||
|
||||
PAtom* {.pure.} = enum ## ``/ =<<lit>Boolean> / =<<lit>Float> / =<<lit>Double> / =<<lit>SignedInteger> / =<<lit>String> / =<<lit>ByteString> / =<<lit>Symbol>``
|
||||
`Boolean`, `Float`, `Double`, `Signedinteger`, `String`, `Bytestring`,
|
||||
`Symbol`
|
||||
PBind*[E = void] {.record: "bind".} = ref object ## ``<bind @pattern Pattern>``
|
||||
`pattern`*: Pattern[E]
|
||||
|
||||
PAnd*[E = void] {.record: "and".} = ref object ## ``<and @patterns [ Pattern ... ]>``
|
||||
`patterns`*: seq[Pattern[E]]
|
||||
|
||||
PNot*[E = void] {.record: "not".} = ref object ## ``<not @pattern Pattern>``
|
||||
`pattern`*: Pattern[E]
|
||||
|
||||
PCompound*[E = void] {.record: "compound".} = ref object ## ``<compound @ctor ConstructorSpec @members PCompoundMembers>``
|
||||
`ctor`*: ConstructorSpec[E]
|
||||
`members`*: PCompoundMembers[E]
|
||||
|
||||
PCompoundMembers*[E = void] = TableRef[Preserve[E], Pattern[E]] ## ``{any : Pattern ...:...}``
|
||||
TemplateKind* {.pure.} = enum
|
||||
`Tattenuate`, `Tref`, `Lit`, `Tcompound`
|
||||
Template*[E = void] = ref object ## ``/ TAttenuate / TRef / Lit / TCompound``
|
||||
case kind*: TemplateKind
|
||||
of TemplateKind.`Tattenuate`:
|
||||
`tattenuate`*: TAttenuate[E]
|
||||
|
||||
of TemplateKind.`Tref`:
|
||||
`tref`*: TRef
|
||||
|
||||
of TemplateKind.`Lit`:
|
||||
`lit`*: Lit[E]
|
||||
|
||||
of TemplateKind.`Tcompound`:
|
||||
`tcompound`*: TCompound[E]
|
||||
|
||||
|
||||
TAttenuate*[E = void] {.record: "attenuate".} = ref object ## ``<attenuate @template Template @attenuation Attenuation>``
|
||||
`template`*: Template[E]
|
||||
`attenuation`*: Attenuation[E]
|
||||
|
||||
TRef* {.record: "ref".} = ref object ## ``<ref @binding int>``
|
||||
`binding`*: BiggestInt
|
||||
|
||||
TCompound*[E = void] {.record: "compound".} = ref object ## ``<compound @ctor ConstructorSpec @members TCompoundMembers>``
|
||||
`ctor`*: ConstructorSpec[E]
|
||||
`members`*: TCompoundMembers[E]
|
||||
|
||||
TCompoundMembers*[E = void] = TableRef[Preserve[E], Template[E]] ## ``{any : Template ...:...}``
|
||||
proc `sturdyRef`*[E = void](`oid`: Preserve[E]; `caveatChain`: Preserve[E];
|
||||
`sig`: seq[byte] | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``SturdyRef``.
|
||||
initRecord[E](symbol[E]("ref"), toPreserve(`oid`, E),
|
||||
toPreserve(`caveatChain`, E), toPreserve(`sig`, E))
|
||||
|
||||
proc toPreserveHook*(`sturdyref`: SturdyRef; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("ref"), toPreserve(`sturdyref`.`oid`, E),
|
||||
toPreserve(`sturdyref`.`caveatChain`, E),
|
||||
toPreserve(`sturdyref`.`sig`, E))
|
||||
|
||||
proc toPreserveHook*(v: Caveat; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of CaveatKind.`Rewrite`:
|
||||
toPreserve(v.`rewrite`, E)
|
||||
of CaveatKind.`Alts`:
|
||||
toPreserve(v.`alts`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Caveat; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("Rewrite"):
|
||||
v = Caveat(kind: CaveatKind.`Rewrite`)
|
||||
result = fromPreserve(v.`rewrite`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Alts"):
|
||||
v = Caveat(kind: CaveatKind.`Alts`)
|
||||
result = fromPreserve(v.`alts`, pr)
|
||||
|
||||
proc `rewrite`*[E = void](`pattern`: Pattern | Preserve[E];
|
||||
`template`: Template | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Rewrite``.
|
||||
initRecord[E](symbol[E]("rewrite"), toPreserve(`pattern`, E),
|
||||
toPreserve(`template`, E))
|
||||
|
||||
proc toPreserveHook*(`rewrite`: Rewrite; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("rewrite"), toPreserve(`rewrite`.`pattern`, E),
|
||||
toPreserve(`rewrite`.`template`, E))
|
||||
|
||||
proc `alts`*[E = void](`alternatives`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Alts``.
|
||||
initRecord[E](symbol[E]("or"), toPreserve(`alternatives`, E))
|
||||
|
||||
proc toPreserveHook*(`alts`: Alts; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("or"), toPreserve(`alts`.`alternatives`, E))
|
||||
|
||||
proc toPreserveHook*(v: WireRef; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of WireRefKind.`mine`:
|
||||
Preserve[E](kind: pkSequence, sequence: @[
|
||||
Preserve[E](kind: pkSignedInteger, int: 0'i64),
|
||||
toPreserve(v.`mine`.`oid`, E)])
|
||||
of WireRefKind.`yours`:
|
||||
Preserve[E](kind: pkSequence, sequence: @[
|
||||
Preserve[E](kind: pkSignedInteger, int: 1'i64),
|
||||
toPreserve(v.`yours`.`oid`, E)] &
|
||||
toPreserve(v.`yours`.`attenuation`, E).sequence)
|
||||
|
||||
proc fromPreserveHook*[E](v: var WireRef; pr: Preserve[E]): bool =
|
||||
if isSequence(pr) and len(pr) == 2 and
|
||||
(pr[0].kind == pkSignedInteger and pr[0].int == 0'i64):
|
||||
v = WireRef(kind: WireRefKind.`mine`)
|
||||
result = fromPreserve(v.`mine`, pr)
|
||||
elif isSequence(pr) and len(pr) >= 2 and
|
||||
(pr[0].kind == pkSignedInteger and pr[0].int == 1'i64):
|
||||
v = WireRef(kind: WireRefKind.`yours`)
|
||||
result = fromPreserve(v.`yours`, pr)
|
||||
|
||||
proc toPreserveHook*(v: ConstructorSpec; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of ConstructorSpecKind.`Crec`:
|
||||
toPreserve(v.`crec`, E)
|
||||
of ConstructorSpecKind.`Carr`:
|
||||
toPreserve(v.`carr`, E)
|
||||
of ConstructorSpecKind.`Cdict`:
|
||||
toPreserve(v.`cdict`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var ConstructorSpec; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("CRec"):
|
||||
v = ConstructorSpec(kind: ConstructorSpecKind.`Crec`)
|
||||
result = fromPreserve(v.`crec`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("CArr"):
|
||||
v = ConstructorSpec(kind: ConstructorSpecKind.`Carr`)
|
||||
result = fromPreserve(v.`carr`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("CDict"):
|
||||
v = ConstructorSpec(kind: ConstructorSpecKind.`Cdict`)
|
||||
result = fromPreserve(v.`cdict`, pr)
|
||||
|
||||
proc `cRec`*[E = void](`label`: Preserve[E]; `arity`: BiggestInt | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``CRec``.
|
||||
initRecord[E](symbol[E]("rec"), toPreserve(`label`, E), toPreserve(`arity`, E))
|
||||
|
||||
proc toPreserveHook*(`crec`: CRec; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("rec"), toPreserve(`crec`.`label`, E),
|
||||
toPreserve(`crec`.`arity`, E))
|
||||
|
||||
proc `cArr`*[E = void](`arity`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``CArr``.
|
||||
initRecord[E](symbol[E]("arr"), toPreserve(`arity`, E))
|
||||
|
||||
proc toPreserveHook*(`carr`: CArr; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("arr"), toPreserve(`carr`.`arity`, E))
|
||||
|
||||
proc `cDict`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``CDict``.
|
||||
initRecord[E](symbol[E]("dict"))
|
||||
|
||||
proc toPreserveHook*(`cdict`: CDict; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("dict"))
|
||||
|
||||
proc `lit`*[E = void](`value`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Lit``.
|
||||
initRecord[E](symbol[E]("lit"), toPreserve(`value`, E))
|
||||
|
||||
proc toPreserveHook*(`lit`: Lit; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("lit"), toPreserve(`lit`.`value`, E))
|
||||
|
||||
proc toPreserveHook*(v: Pattern; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of PatternKind.`Pdiscard`:
|
||||
toPreserve(v.`pdiscard`, E)
|
||||
of PatternKind.`Patom`:
|
||||
toPreserve(v.`patom`, E)
|
||||
of PatternKind.`Pembedded`:
|
||||
Preserve[E](kind: pkSymbol, symbol: "Embedded")
|
||||
of PatternKind.`Pbind`:
|
||||
toPreserve(v.`pbind`, E)
|
||||
of PatternKind.`Pand`:
|
||||
toPreserve(v.`pand`, E)
|
||||
of PatternKind.`Pnot`:
|
||||
toPreserve(v.`pnot`, E)
|
||||
of PatternKind.`Lit`:
|
||||
toPreserve(v.`lit`, E)
|
||||
of PatternKind.`Pcompound`:
|
||||
toPreserve(v.`pcompound`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Pattern; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("PDiscard"):
|
||||
v = Pattern(kind: PatternKind.`Pdiscard`)
|
||||
result = fromPreserve(v.`pdiscard`, pr)
|
||||
elif false: ## snkOr - / =<<lit>Boolean> / =<<lit>Float> / =<<lit>Double> / =<<lit>SignedInteger> / =<<lit>String> / =<<lit>ByteString> / =<<lit>Symbol>
|
||||
discard
|
||||
elif pr.kind == pkSymbol and pr.symbol == "Embedded":
|
||||
v = Pattern(kind: PatternKind.`Pembedded`)
|
||||
result = true
|
||||
elif isRecord(pr) and pr.label.isSymbol("PBind"):
|
||||
v = Pattern(kind: PatternKind.`Pbind`)
|
||||
result = fromPreserve(v.`pbind`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("PAnd"):
|
||||
v = Pattern(kind: PatternKind.`Pand`)
|
||||
result = fromPreserve(v.`pand`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("PNot"):
|
||||
v = Pattern(kind: PatternKind.`Pnot`)
|
||||
result = fromPreserve(v.`pnot`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Lit"):
|
||||
v = Pattern(kind: PatternKind.`Lit`)
|
||||
result = fromPreserve(v.`lit`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("PCompound"):
|
||||
v = Pattern(kind: PatternKind.`Pcompound`)
|
||||
result = fromPreserve(v.`pcompound`, pr)
|
||||
|
||||
proc `pDiscard`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``PDiscard``.
|
||||
initRecord[E](symbol[E]("_"))
|
||||
|
||||
proc toPreserveHook*(`pdiscard`: PDiscard; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("_"))
|
||||
|
||||
proc toPreserveHook*(v: PAtom; E: typedesc): Preserve[E] =
|
||||
case v
|
||||
of PAtom.`Boolean`:
|
||||
symbol[E]("Boolean")
|
||||
of PAtom.`Float`:
|
||||
symbol[E]("Float")
|
||||
of PAtom.`Double`:
|
||||
symbol[E]("Double")
|
||||
of PAtom.`Signedinteger`:
|
||||
symbol[E]("SignedInteger")
|
||||
of PAtom.`String`:
|
||||
symbol[E]("String")
|
||||
of PAtom.`Bytestring`:
|
||||
symbol[E]("ByteString")
|
||||
of PAtom.`Symbol`:
|
||||
symbol[E]("Symbol")
|
||||
|
||||
proc fromPreserveHook*[E](v: var PAtom; pr: Preserve[E]): bool =
|
||||
if isSymbol(pr):
|
||||
case pr.symbol
|
||||
of "Boolean":
|
||||
v = PAtom.`Boolean`
|
||||
result = true
|
||||
of "Float":
|
||||
v = PAtom.`Float`
|
||||
result = true
|
||||
of "Double":
|
||||
v = PAtom.`Double`
|
||||
result = true
|
||||
of "SignedInteger":
|
||||
v = PAtom.`Signedinteger`
|
||||
result = true
|
||||
of "String":
|
||||
v = PAtom.`String`
|
||||
result = true
|
||||
of "ByteString":
|
||||
v = PAtom.`Bytestring`
|
||||
result = true
|
||||
of "Symbol":
|
||||
v = PAtom.`Symbol`
|
||||
result = true
|
||||
|
||||
proc pEmbedded*[E = void](): Preserve[E] =
|
||||
## ``<<lit>Embedded>``
|
||||
symbol[E]("Embedded")
|
||||
|
||||
proc `pBind`*[E = void](`pattern`: Pattern | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``PBind``.
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`pattern`, E))
|
||||
|
||||
proc toPreserveHook*(`pbind`: PBind; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("bind"), toPreserve(`pbind`.`pattern`, E))
|
||||
|
||||
proc `pAnd`*[E = void](`patterns`: Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``PAnd``.
|
||||
initRecord[E](symbol[E]("and"), toPreserve(`patterns`, E))
|
||||
|
||||
proc toPreserveHook*(`pand`: PAnd; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("and"), toPreserve(`pand`.`patterns`, E))
|
||||
|
||||
proc `pNot`*[E = void](`pattern`: Pattern | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``PNot``.
|
||||
initRecord[E](symbol[E]("not"), toPreserve(`pattern`, E))
|
||||
|
||||
proc toPreserveHook*(`pnot`: PNot; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("not"), toPreserve(`pnot`.`pattern`, E))
|
||||
|
||||
proc `pCompound`*[E = void](`ctor`: ConstructorSpec | Preserve[E];
|
||||
`members`: PCompoundMembers | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``PCompound``.
|
||||
initRecord[E](symbol[E]("compound"), toPreserve(`ctor`, E),
|
||||
toPreserve(`members`, E))
|
||||
|
||||
proc toPreserveHook*(`pcompound`: PCompound; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("compound"), toPreserve(`pcompound`.`ctor`, E),
|
||||
toPreserve(`pcompound`.`members`, E))
|
||||
|
||||
proc toPreserveHook*(v: Template; E: typedesc): Preserve[E] =
|
||||
case v.kind
|
||||
of TemplateKind.`Tattenuate`:
|
||||
toPreserve(v.`tattenuate`, E)
|
||||
of TemplateKind.`Tref`:
|
||||
toPreserve(v.`tref`, E)
|
||||
of TemplateKind.`Lit`:
|
||||
toPreserve(v.`lit`, E)
|
||||
of TemplateKind.`Tcompound`:
|
||||
toPreserve(v.`tcompound`, E)
|
||||
|
||||
proc fromPreserveHook*[E](v: var Template; pr: Preserve[E]): bool =
|
||||
if isRecord(pr) and pr.label.isSymbol("TAttenuate"):
|
||||
v = Template(kind: TemplateKind.`Tattenuate`)
|
||||
result = fromPreserve(v.`tattenuate`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("TRef"):
|
||||
v = Template(kind: TemplateKind.`Tref`)
|
||||
result = fromPreserve(v.`tref`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("Lit"):
|
||||
v = Template(kind: TemplateKind.`Lit`)
|
||||
result = fromPreserve(v.`lit`, pr)
|
||||
elif isRecord(pr) and pr.label.isSymbol("TCompound"):
|
||||
v = Template(kind: TemplateKind.`Tcompound`)
|
||||
result = fromPreserve(v.`tcompound`, pr)
|
||||
|
||||
proc `tAttenuate`*[E = void](`template`: Template | Preserve[E];
|
||||
`attenuation`: Attenuation | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``TAttenuate``.
|
||||
initRecord[E](symbol[E]("attenuate"), toPreserve(`template`, E),
|
||||
toPreserve(`attenuation`, E))
|
||||
|
||||
proc toPreserveHook*(`tattenuate`: TAttenuate; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("attenuate"), toPreserve(`tattenuate`.`template`, E),
|
||||
toPreserve(`tattenuate`.`attenuation`, E))
|
||||
|
||||
proc `tRef`*[E = void](`binding`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``TRef``.
|
||||
initRecord[E](symbol[E]("ref"), toPreserve(`binding`, E))
|
||||
|
||||
proc toPreserveHook*(`tref`: TRef; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("ref"), toPreserve(`tref`.`binding`, E))
|
||||
|
||||
proc `tCompound`*[E = void](`ctor`: ConstructorSpec | Preserve[E];
|
||||
`members`: TCompoundMembers | Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``TCompound``.
|
||||
initRecord[E](symbol[E]("compound"), toPreserve(`ctor`, E),
|
||||
toPreserve(`members`, E))
|
||||
|
||||
proc toPreserveHook*(`tcompound`: TCompound; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("compound"), toPreserve(`tcompound`.`ctor`, E),
|
||||
toPreserve(`tcompound`.`members`, E))
|
||||
|
||||
proc `$`*[E](x: SturdyRef[E] | Attenuation[E] | Caveat[E] | Rewrite[E] | Alts[E] |
|
||||
Oid |
|
||||
WireRef[E] |
|
||||
ConstructorSpec[E] |
|
||||
CRec[E] |
|
||||
CArr |
|
||||
CDict |
|
||||
Lit[E] |
|
||||
Pattern[E] |
|
||||
PDiscard |
|
||||
PAtom |
|
||||
PBind[E] |
|
||||
PAnd[E] |
|
||||
PNot[E] |
|
||||
PCompound[E] |
|
||||
PCompoundMembers[E] |
|
||||
Template[E] |
|
||||
TAttenuate[E] |
|
||||
TRef |
|
||||
TCompound[E] |
|
||||
TCompoundMembers[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: SturdyRef[E] | Attenuation[E] | Caveat[E] | Rewrite[E] |
|
||||
Alts[E] |
|
||||
Oid |
|
||||
WireRef[E] |
|
||||
ConstructorSpec[E] |
|
||||
CRec[E] |
|
||||
CArr |
|
||||
CDict |
|
||||
Lit[E] |
|
||||
Pattern[E] |
|
||||
PDiscard |
|
||||
PAtom |
|
||||
PBind[E] |
|
||||
PAnd[E] |
|
||||
PNot[E] |
|
||||
PCompound[E] |
|
||||
PCompoundMembers[E] |
|
||||
Template[E] |
|
||||
TAttenuate[E] |
|
||||
TRef |
|
||||
TCompound[E] |
|
||||
TCompoundMembers[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,55 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
TcpRemote* {.record: "tcp-remote".} = ref object ## ``<tcp-remote @host string @port int>``
|
||||
`host`*: string
|
||||
`port`*: BiggestInt
|
||||
|
||||
TcpLocal* {.record: "tcp-local".} = ref object ## ``<tcp-local @host string @port int>``
|
||||
`host`*: string
|
||||
`port`*: BiggestInt
|
||||
|
||||
TcpPeerInfo*[E = void] {.record: "tcp-peer".} = ref object ## ``<tcp-peer @handle #!any @local TcpLocal @remote TcpRemote>``
|
||||
`handle`*: Preserve[E]
|
||||
`local`*: TcpLocal
|
||||
`remote`*: TcpRemote
|
||||
|
||||
proc `tcpRemote`*[E = void](`host`: string | Preserve[E];
|
||||
`port`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``TcpRemote``.
|
||||
initRecord[E](symbol[E]("tcp-remote"), toPreserve(`host`, E),
|
||||
toPreserve(`port`, E))
|
||||
|
||||
proc toPreserveHook*(`tcpremote`: TcpRemote; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("tcp-remote"), toPreserve(`tcpremote`.`host`, E),
|
||||
toPreserve(`tcpremote`.`port`, E))
|
||||
|
||||
proc `tcpLocal`*[E = void](`host`: string | Preserve[E];
|
||||
`port`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``TcpLocal``.
|
||||
initRecord[E](symbol[E]("tcp-local"), toPreserve(`host`, E),
|
||||
toPreserve(`port`, E))
|
||||
|
||||
proc toPreserveHook*(`tcplocal`: TcpLocal; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("tcp-local"), toPreserve(`tcplocal`.`host`, E),
|
||||
toPreserve(`tcplocal`.`port`, E))
|
||||
|
||||
proc `tcpPeerInfo`*[E = void](`handle`: Preserve[E];
|
||||
`local`: TcpLocal | Preserve[E];
|
||||
`remote`: TcpRemote | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``TcpPeerInfo``.
|
||||
initRecord[E](symbol[E]("tcp-peer"), toPreserve(`handle`, E),
|
||||
toPreserve(`local`, E), toPreserve(`remote`, E))
|
||||
|
||||
proc toPreserveHook*(`tcppeerinfo`: TcpPeerInfo; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("tcp-peer"), toPreserve(`tcppeerinfo`.`handle`, E),
|
||||
toPreserve(`tcppeerinfo`.`local`, E),
|
||||
toPreserve(`tcppeerinfo`.`remote`, E))
|
||||
|
||||
proc `$`*[E](x: TcpRemote | TcpLocal | TcpPeerInfo[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: TcpRemote | TcpLocal | TcpPeerInfo[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,76 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
SetTimer*[E = void] {.record: "set-timer".} = ref object ## ``<set-timer @label any @msecs double @kind TimerKind>``
|
||||
`label`*: Preserve[E]
|
||||
`msecs`*: float64
|
||||
`kind`*: TimerKind
|
||||
|
||||
TimerExpired*[E = void] {.record: "timer-expired".} = ref object ## ``<timer-expired @label any @msecs double>``
|
||||
`label`*: Preserve[E]
|
||||
`msecs`*: float64
|
||||
|
||||
TimerKind* {.pure.} = enum ## ``/ =<<lit>relative> / =<<lit>absolute> / =<<lit>clear>``
|
||||
`relative`, `absolute`, `clear`
|
||||
LaterThan* {.record: "later-than".} = ref object ## ``<later-than @msecs double>``
|
||||
`msecs`*: float64
|
||||
|
||||
proc `setTimer`*[E = void](`label`: Preserve[E]; `msecs`: float64 | Preserve[E];
|
||||
`kind`: TimerKind | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``SetTimer``.
|
||||
initRecord[E](symbol[E]("set-timer"), toPreserve(`label`, E),
|
||||
toPreserve(`msecs`, E), toPreserve(`kind`, E))
|
||||
|
||||
proc toPreserveHook*(`settimer`: SetTimer; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("set-timer"), toPreserve(`settimer`.`label`, E),
|
||||
toPreserve(`settimer`.`msecs`, E),
|
||||
toPreserve(`settimer`.`kind`, E))
|
||||
|
||||
proc `timerExpired`*[E = void](`label`: Preserve[E];
|
||||
`msecs`: float64 | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``TimerExpired``.
|
||||
initRecord[E](symbol[E]("timer-expired"), toPreserve(`label`, E),
|
||||
toPreserve(`msecs`, E))
|
||||
|
||||
proc toPreserveHook*(`timerexpired`: TimerExpired; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("timer-expired"),
|
||||
toPreserve(`timerexpired`.`label`, E),
|
||||
toPreserve(`timerexpired`.`msecs`, E))
|
||||
|
||||
proc toPreserveHook*(v: TimerKind; E: typedesc): Preserve[E] =
|
||||
case v
|
||||
of TimerKind.`relative`:
|
||||
symbol[E]("relative")
|
||||
of TimerKind.`absolute`:
|
||||
symbol[E]("absolute")
|
||||
of TimerKind.`clear`:
|
||||
symbol[E]("clear")
|
||||
|
||||
proc fromPreserveHook*[E](v: var TimerKind; pr: Preserve[E]): bool =
|
||||
if isSymbol(pr):
|
||||
case pr.symbol
|
||||
of "relative":
|
||||
v = TimerKind.`relative`
|
||||
result = true
|
||||
of "absolute":
|
||||
v = TimerKind.`absolute`
|
||||
result = true
|
||||
of "clear":
|
||||
v = TimerKind.`clear`
|
||||
result = true
|
||||
|
||||
proc `laterThan`*[E = void](`msecs`: float64 | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``LaterThan``.
|
||||
initRecord[E](symbol[E]("later-than"), toPreserve(`msecs`, E))
|
||||
|
||||
proc toPreserveHook*(`laterthan`: LaterThan; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("later-than"), toPreserve(`laterthan`.`msecs`, E))
|
||||
|
||||
proc `$`*[E](x: SetTimer[E] | TimerExpired[E] | TimerKind | LaterThan): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: SetTimer[E] | TimerExpired[E] | TimerKind | LaterThan): seq[
|
||||
byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
Tcp* {.record: "tcp".} = ref object ## ``<tcp @host string @port int>``
|
||||
`host`*: string
|
||||
`port`*: BiggestInt
|
||||
|
||||
Unix* {.record: "unix".} = ref object ## ``<unix @path string>``
|
||||
`path`*: string
|
||||
|
||||
WebSocket* {.record: "ws".} = ref object ## ``<ws @url string>``
|
||||
`url`*: string
|
||||
|
||||
Stdio* {.record: "stdio".} = object ## ``<stdio>``
|
||||
discard
|
||||
|
||||
proc `tcp`*[E = void](`host`: string | Preserve[E];
|
||||
`port`: BiggestInt | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Tcp``.
|
||||
initRecord[E](symbol[E]("tcp"), toPreserve(`host`, E), toPreserve(`port`, E))
|
||||
|
||||
proc toPreserveHook*(`tcp`: Tcp; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("tcp"), toPreserve(`tcp`.`host`, E),
|
||||
toPreserve(`tcp`.`port`, E))
|
||||
|
||||
proc `unix`*[E = void](`path`: string | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``Unix``.
|
||||
initRecord[E](symbol[E]("unix"), toPreserve(`path`, E))
|
||||
|
||||
proc toPreserveHook*(`unix`: Unix; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("unix"), toPreserve(`unix`.`path`, E))
|
||||
|
||||
proc `webSocket`*[E = void](`url`: string | Preserve[E]): Preserve[E] =
|
||||
## Preserves constructor for ``WebSocket``.
|
||||
initRecord[E](symbol[E]("ws"), toPreserve(`url`, E))
|
||||
|
||||
proc toPreserveHook*(`websocket`: WebSocket; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("ws"), toPreserve(`websocket`.`url`, E))
|
||||
|
||||
proc `stdio`*[E = void](): Preserve[E] =
|
||||
## Preserves constructor for ``Stdio``.
|
||||
initRecord[E](symbol[E]("stdio"))
|
||||
|
||||
proc toPreserveHook*(`stdio`: Stdio; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("stdio"))
|
||||
|
||||
proc `$`*[E](x: Tcp | Unix | WebSocket | Stdio): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Tcp | Unix | WebSocket | Stdio): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
import
|
||||
std/typetraits, preserves
|
||||
|
||||
type
|
||||
Instance*[E = void] {.record: "Instance".} = ref object ## ``<Instance @name string @argument any>``
|
||||
`name`*: string
|
||||
`argument`*: Preserve[E]
|
||||
|
||||
proc `instance`*[E = void](`name`: string | Preserve[E]; `argument`: Preserve[E]): Preserve[
|
||||
E] =
|
||||
## Preserves constructor for ``Instance``.
|
||||
initRecord[E](symbol[E]("Instance"), toPreserve(`name`, E),
|
||||
toPreserve(`argument`, E))
|
||||
|
||||
proc toPreserveHook*(`instance`: Instance; E: typedesc): Preserve[E] =
|
||||
initRecord[E](symbol[E]("Instance"), toPreserve(`instance`.`name`, E),
|
||||
toPreserve(`instance`.`argument`, E))
|
||||
|
||||
proc `$`*[E](x: Instance[E]): string =
|
||||
`$`(toPreserve(x, E))
|
||||
|
||||
proc `encode`*[E](x: Instance[E]): seq[byte] =
|
||||
encode(toPreserve(x, E))
|
|
@ -1,5 +0,0 @@
|
|||
version 1.
|
||||
|
||||
BoxState = <box-state @value int> .
|
||||
|
||||
SetBox = <set-box @value int> .
|
Loading…
Reference in New Issue