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:
Emery Hemingway 2021-10-06 11:30:38 +02:00
parent 3509573f55
commit 8447822243
41 changed files with 1709 additions and 226 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
tests/test_box_and_client
tests/test_dsl
tests/test_timer
*.nim.check
.tup

3
.gitmodules vendored
View File

@ -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

1
protocols Submodule

@ -0,0 +1 @@
Subproject commit 6cfd97c91ae15197190ad50c71b8cfcd45da0f6e

View File

@ -1,4 +0,0 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
type EventKind* = enum addedEvent, removedEvent, messageEvent

View File

@ -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 $@

View File

@ -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}

View File

@ -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))

View File

@ -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))

View File

@ -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.

View File

@ -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))

View File

@ -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))

View File

@ -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„„„„„

View File

@ -1,2 +0,0 @@
type Cap* = object
discard

View File

@ -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}

View File

@ -1,4 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
Observe = <Observe @pattern dataspacePatterns.Pattern @observer #!any>.

View File

@ -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>.

View File

@ -1,3 +0,0 @@
version 1 .
embeddedType sturdy.WireRef .
include "genericProtocol.prs".

View File

@ -1,5 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
Resolve = <resolve @sturdyref sturdy.SturdyRef @observer #!#!any>.
Bind = <bind @oid any @key bytes @target #!any>.

View File

@ -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>.

View File

@ -1,3 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
include "genericProtocol.prs".

View File

@ -1,3 +0,0 @@
version 1 .
RacketEvent = <racket-event @source #!any @event #!any>.

View File

@ -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>.

View File

@ -1,5 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
RequireService = <require-service @serviceName any>.
ServiceRunning = <service-running @serviceName any>.

View File

@ -1,5 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
Present = <Present @username string>.
Says = <Says @who string @what string>.

View File

@ -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 .

View File

@ -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 ...:... }.

View File

@ -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>.

View File

@ -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>.

View File

@ -1,6 +0,0 @@
version 1 .
Tcp = <tcp @host string @port int>.
Unix = <unix @path string>.
WebSocket = <ws @url string>.
Stdio = <stdio>.

View File

@ -1,4 +0,0 @@
version 1 .
embeddedType EntityRef.Cap .
Instance = <Instance @name string @argument any>.

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -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))

View File

@ -1,5 +0,0 @@
version 1.
BoxState = <box-state @value int> .
SetBox = <set-box @value int> .