diff --git a/.gitignore b/.gitignore index 7ab75ff..f1fcb7e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ tests/test_box_and_client tests/test_dsl tests/test_timer +*.nim.check +.tup diff --git a/.gitmodules b/.gitmodules index 07618fe..1a18c82 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/protocols b/protocols new file mode 160000 index 0000000..6cfd97c --- /dev/null +++ b/protocols @@ -0,0 +1 @@ +Subproject commit 6cfd97c91ae15197190ad50c71b8cfcd45da0f6e diff --git a/src/syndicate/events.nim b/src/syndicate/events.nim deleted file mode 100644 index e4fa540..0000000 --- a/src/syndicate/events.nim +++ /dev/null @@ -1,4 +0,0 @@ -# SPDX-FileCopyrightText: 2021 ā˜­ Emery Hemingway -# SPDX-License-Identifier: Unlicense - -type EventKind* = enum addedEvent, removedEvent, messageEvent diff --git a/src/syndicate/protocols/Makefile b/src/syndicate/protocols/Makefile deleted file mode 100644 index 1efe0bd..0000000 --- a/src/syndicate/protocols/Makefile +++ /dev/null @@ -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 $@ diff --git a/src/syndicate/protocols/Tupfile b/src/syndicate/protocols/Tupfile new file mode 100644 index 0000000..02f29a6 --- /dev/null +++ b/src/syndicate/protocols/Tupfile @@ -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} diff --git a/src/syndicate/protocols/dataspace.nim b/src/syndicate/protocols/dataspace.nim new file mode 100644 index 0000000..2c88063 --- /dev/null +++ b/src/syndicate/protocols/dataspace.nim @@ -0,0 +1,24 @@ + +import + std/typetraits, preserves, dataspacePatterns + +type + Observe*[E = void] {.record: "Observe".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/dataspacePatterns.nim b/src/syndicate/protocols/dataspacePatterns.nim new file mode 100644 index 0000000..9ff066e --- /dev/null +++ b/src/syndicate/protocols/dataspacePatterns.nim @@ -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 ## ```` + `pattern`*: Pattern[E] + + DLit*[E = void] {.record: "lit".} = ref object ## ```` + `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 ## ``/ / / `` + 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 ## ```` + `label`*: Preserve[E] + `arity`*: BiggestInt + + CArr* {.record: "arr".} = ref object ## ```` + `arity`*: BiggestInt + + CDict* {.record: "dict".} = object ## ```` + 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 - / / / + 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)) diff --git a/src/syndicate/protocols/gatekeeper.nim b/src/syndicate/protocols/gatekeeper.nim new file mode 100644 index 0000000..deb0303 --- /dev/null +++ b/src/syndicate/protocols/gatekeeper.nim @@ -0,0 +1,39 @@ + +import + std/typetraits, preserves, sturdy + +type + Resolve*[E = void] {.record: "resolve".} = ref object ## ```` + `sturdyref`*: sturdy.SturdyRef + `observer`*: Preserve[E] + + Bind*[E = void] {.record: "bind".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/preserves_schema_nim b/src/syndicate/protocols/preserves_schema_nim new file mode 100755 index 0000000..be2b128 Binary files /dev/null and b/src/syndicate/protocols/preserves_schema_nim differ diff --git a/src/syndicate/protocols/protocol.nim b/src/syndicate/protocols/protocol.nim new file mode 100644 index 0000000..3db52d9 --- /dev/null +++ b/src/syndicate/protocols/protocol.nim @@ -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 ## ```` + `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 ## ```` + `assertion`*: Assertion[E] + `handle`*: Handle + + Retract* {.record: "retract".} = ref object ## ```` + `handle`*: Handle + + Message*[E = void] {.record: "message".} = ref object ## ```` + `body`*: Assertion[E] + + Sync* {.record: "sync".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/racketEvent.nim b/src/syndicate/protocols/racketEvent.nim new file mode 100644 index 0000000..17bce27 --- /dev/null +++ b/src/syndicate/protocols/racketEvent.nim @@ -0,0 +1,25 @@ + +import + std/typetraits, preserves + +type + RacketEvent*[E = void] {.record: "racket-event".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/schema-bundle.bin b/src/syndicate/protocols/schema-bundle.bin deleted file mode 100644 index e3fb2a6..0000000 --- a/src/syndicate/protocols/schema-bundle.bin +++ /dev/null @@ -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„“³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„„„„„„³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„„„„„„³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„„„„„„³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„„µ± 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„„„„„ \ No newline at end of file diff --git a/src/syndicate/protocols/schemas/EntityRef.nim b/src/syndicate/protocols/schemas/EntityRef.nim deleted file mode 100644 index 0aac8ed..0000000 --- a/src/syndicate/protocols/schemas/EntityRef.nim +++ /dev/null @@ -1,2 +0,0 @@ -type Cap* = object - discard diff --git a/src/syndicate/protocols/schemas/Tupfile b/src/syndicate/protocols/schemas/Tupfile deleted file mode 100644 index ab46249..0000000 --- a/src/syndicate/protocols/schemas/Tupfile +++ /dev/null @@ -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} diff --git a/src/syndicate/protocols/schemas/dataspace.prs b/src/syndicate/protocols/schemas/dataspace.prs deleted file mode 100644 index 25c6640..0000000 --- a/src/syndicate/protocols/schemas/dataspace.prs +++ /dev/null @@ -1,4 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -Observe = . diff --git a/src/syndicate/protocols/schemas/dataspacePatterns.prs b/src/syndicate/protocols/schemas/dataspacePatterns.prs deleted file mode 100644 index 0a69faf..0000000 --- a/src/syndicate/protocols/schemas/dataspacePatterns.prs +++ /dev/null @@ -1,16 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -; Dataspace patterns: a sublanguage of attenuation patterns. -Pattern = DDiscard / DBind / DLit / DCompound . - -DDiscard = <_>. -DBind = . -DLit = . -DCompound = @rec - / @arr - / @dict . - -CRec = . -CArr = . -CDict = . diff --git a/src/syndicate/protocols/schemas/externalProtocol.prs b/src/syndicate/protocols/schemas/externalProtocol.prs deleted file mode 100644 index 2bab9e3..0000000 --- a/src/syndicate/protocols/schemas/externalProtocol.prs +++ /dev/null @@ -1,3 +0,0 @@ -version 1 . -embeddedType sturdy.WireRef . -include "genericProtocol.prs". diff --git a/src/syndicate/protocols/schemas/gatekeeper.prs b/src/syndicate/protocols/schemas/gatekeeper.prs deleted file mode 100644 index 43da79a..0000000 --- a/src/syndicate/protocols/schemas/gatekeeper.prs +++ /dev/null @@ -1,5 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -Resolve = . -Bind = . diff --git a/src/syndicate/protocols/schemas/genericProtocol.prs b/src/syndicate/protocols/schemas/genericProtocol.prs deleted file mode 100644 index 42b5038..0000000 --- a/src/syndicate/protocols/schemas/genericProtocol.prs +++ /dev/null @@ -1,17 +0,0 @@ -version 1 . - -Packet = Turn / Error . - -Error = . - -Assertion = any . -Handle = int . -Event = Assert / Retract / Message / Sync . -Oid = int . -Turn = [TurnEvent ...]. -TurnEvent = [@oid Oid @event Event]. - -Assert = . -Retract = . -Message = . -Sync = . diff --git a/src/syndicate/protocols/schemas/internalProtocol.prs b/src/syndicate/protocols/schemas/internalProtocol.prs deleted file mode 100644 index 59f720b..0000000 --- a/src/syndicate/protocols/schemas/internalProtocol.prs +++ /dev/null @@ -1,3 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . -include "genericProtocol.prs". diff --git a/src/syndicate/protocols/schemas/racketEvent.prs b/src/syndicate/protocols/schemas/racketEvent.prs deleted file mode 100644 index 36985a7..0000000 --- a/src/syndicate/protocols/schemas/racketEvent.prs +++ /dev/null @@ -1,3 +0,0 @@ -version 1 . - -RacketEvent = . diff --git a/src/syndicate/protocols/schemas/secureChatProtocol.prs b/src/syndicate/protocols/schemas/secureChatProtocol.prs deleted file mode 100644 index 6899495..0000000 --- a/src/syndicate/protocols/schemas/secureChatProtocol.prs +++ /dev/null @@ -1,21 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -UserId = int . - -Join = . - -Session = @observeUsers - / @observeSpeech - / NickClaim - / Says -. - -NickClaim = . -NickClaimResponse = #t / NickConflict . - -UserInfo = . - -Says = . - -NickConflict = . diff --git a/src/syndicate/protocols/schemas/service.prs b/src/syndicate/protocols/schemas/service.prs deleted file mode 100644 index fde204d..0000000 --- a/src/syndicate/protocols/schemas/service.prs +++ /dev/null @@ -1,5 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -RequireService = . -ServiceRunning = . diff --git a/src/syndicate/protocols/schemas/simpleChatProtocol.prs b/src/syndicate/protocols/schemas/simpleChatProtocol.prs deleted file mode 100644 index c738739..0000000 --- a/src/syndicate/protocols/schemas/simpleChatProtocol.prs +++ /dev/null @@ -1,5 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -Present = . -Says = . diff --git a/src/syndicate/protocols/schemas/stream.prs b/src/syndicate/protocols/schemas/stream.prs deleted file mode 100644 index f59101f..0000000 --- a/src/syndicate/protocols/schemas/stream.prs +++ /dev/null @@ -1,38 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -; Assertion: -StreamConnection = . - -; Assertions: -StreamListenerReady = . -StreamListenerError = . - -; Assertion: -StreamError = . - -Source = - ; Assertions: - / - / StreamError - - ; Messages: - / -. - -Sink = - ; Assertions: - / - / StreamError - - ; Messages: - / - / -. - -; Value: -CreditAmount = @count int / @unbounded =unbounded . - -; Value: -Mode = =bytes / @lines LineMode / / . -LineMode = =lf / =crlf . diff --git a/src/syndicate/protocols/schemas/sturdy.prs b/src/syndicate/protocols/schemas/sturdy.prs deleted file mode 100644 index 85f6c6c..0000000 --- a/src/syndicate/protocols/schemas/sturdy.prs +++ /dev/null @@ -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 = . - -; 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 = . -Alts = . - -Oid = int . -WireRef = @mine [0 @oid Oid] / @yours [1 @oid Oid @attenuation Caveat ...]. - -;--------------------------------------------------------------------------- - -ConstructorSpec = CRec / CArr / CDict . -CRec = . -CArr = . -CDict = . - -Lit = . - -Pattern = PDiscard / PAtom / PEmbedded / PBind / PAnd / PNot / Lit / PCompound . -PDiscard = <_>. -PAtom = =Boolean / =Float / =Double / =SignedInteger / =String / =ByteString / =Symbol . -PEmbedded = =Embedded . -PBind = . -PAnd = . -PNot = . -PCompound = . -PCompoundMembers = { any: Pattern ...:... }. - -Template = TAttenuate / TRef / Lit / TCompound . -TAttenuate = . -TRef = . -TCompound = . -TCompoundMembers = { any: Template ...:... }. diff --git a/src/syndicate/protocols/schemas/tcp.prs b/src/syndicate/protocols/schemas/tcp.prs deleted file mode 100644 index cc34741..0000000 --- a/src/syndicate/protocols/schemas/tcp.prs +++ /dev/null @@ -1,7 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -TcpRemote = . -TcpLocal = . - -TcpPeerInfo = . diff --git a/src/syndicate/protocols/schemas/timer.prs b/src/syndicate/protocols/schemas/timer.prs deleted file mode 100644 index 30ea166..0000000 --- a/src/syndicate/protocols/schemas/timer.prs +++ /dev/null @@ -1,7 +0,0 @@ -version 1 . - -SetTimer = . -TimerExpired = . -TimerKind = =relative / =absolute / =clear . - -LaterThan = . diff --git a/src/syndicate/protocols/schemas/transportAddress.prs b/src/syndicate/protocols/schemas/transportAddress.prs deleted file mode 100644 index ee51a10..0000000 --- a/src/syndicate/protocols/schemas/transportAddress.prs +++ /dev/null @@ -1,6 +0,0 @@ -version 1 . - -Tcp = . -Unix = . -WebSocket = . -Stdio = . diff --git a/src/syndicate/protocols/schemas/worker.prs b/src/syndicate/protocols/schemas/worker.prs deleted file mode 100644 index b0fb53e..0000000 --- a/src/syndicate/protocols/schemas/worker.prs +++ /dev/null @@ -1,4 +0,0 @@ -version 1 . -embeddedType EntityRef.Cap . - -Instance = . diff --git a/src/syndicate/protocols/secureChatProtocol.nim b/src/syndicate/protocols/secureChatProtocol.nim new file mode 100644 index 0000000..1320e03 --- /dev/null +++ b/src/syndicate/protocols/secureChatProtocol.nim @@ -0,0 +1,161 @@ + +import + std/typetraits, preserves + +type + UserId* = distinct BiggestInt ## ``int`` + Join* {.record: "joinedUser".} = ref object ## ```` + `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 ## ``/ user> @observer #!UserInfo> / 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 ## ```` + `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 ## ```` + `uid`*: UserId + `name`*: string + + Says* {.record: "says".} = ref object ## ```` + `who`*: UserId + `what`*: string + + NickConflict* {.record: "nickConflict".} = object ## ```` + 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)) diff --git a/src/syndicate/protocols/service.nim b/src/syndicate/protocols/service.nim new file mode 100644 index 0000000..be1f284 --- /dev/null +++ b/src/syndicate/protocols/service.nim @@ -0,0 +1,121 @@ + +import + std/typetraits, preserves + +type + RequireService*[E = void] {.record: "require-service".} = ref object ## ```` + `serviceName`*: Preserve[E] + + RunService*[E = void] {.record: "run-service".} = ref object ## ```` + `serviceName`*: Preserve[E] + + ServiceStarted*[E = void] {.record: "service-started".} = ref object ## ```` + `serviceName`*: Preserve[E] + + ServiceRunning*[E = void] {.record: "service-running".} = ref object ## ```` + `serviceName`*: Preserve[E] + + ServiceDependency*[E = void] {.record: "depends-on".} = ref object ## ```` + `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 ## ```` + `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)) diff --git a/src/syndicate/protocols/simpleChatProtocol.nim b/src/syndicate/protocols/simpleChatProtocol.nim new file mode 100644 index 0000000..41a5f83 --- /dev/null +++ b/src/syndicate/protocols/simpleChatProtocol.nim @@ -0,0 +1,33 @@ + +import + std/typetraits, preserves + +type + Present* {.record: "Present".} = ref object ## ```` + `username`*: string + + Says* {.record: "Says".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/stream.nim b/src/syndicate/protocols/stream.nim new file mode 100644 index 0000000..eebee88 --- /dev/null +++ b/src/syndicate/protocols/stream.nim @@ -0,0 +1,268 @@ + +import + std/typetraits, preserves + +type + StreamConnection*[E = void] {.record: "stream-connection".} = ref object ## ```` + `source`*: Source[E] + `sink`*: Sink[E] + `spec`*: Preserve[E] + + StreamListenerReady*[E = void] {.record: "stream-listener-ready".} = ref object ## ```` + `spec`*: Preserve[E] + + StreamListenerError*[E = void] {.record: "stream-listener-error".} = ref object ## ```` + `spec`*: Preserve[E] + `message`*: string + + StreamError* {.record: "error".} = ref object ## ```` + `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 ## ``/ / StreamError / `` + 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 ## ``/ / StreamError / / `` + 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 / =<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 ## ``/ =<bytes> / LineMode / / `` + 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 ## ``/ =<lf> / =<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 - / =<lf> / =<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)) diff --git a/src/syndicate/protocols/sturdy.nim b/src/syndicate/protocols/sturdy.nim new file mode 100644 index 0000000..3151832 --- /dev/null +++ b/src/syndicate/protocols/sturdy.nim @@ -0,0 +1,494 @@ + +import + std/typetraits, preserves, std/tables, std/tables + +type + SturdyRef*[E = void] {.record: "ref".} = ref object ## ```` + `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 ## ```` + `pattern`*: Pattern[E] + `template`*: Template[E] + + Alts*[E = void] {.record: "or".} = ref object ## ```` + `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 ## ```` + `label`*: Preserve[E] + `arity`*: BiggestInt + + CArr* {.record: "arr".} = ref object ## ```` + `arity`*: BiggestInt + + CDict* {.record: "dict".} = object ## ```` + discard + + Lit*[E = void] {.record: "lit".} = ref object ## ```` + `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 ## ``/ =<Boolean> / =<Float> / =<Double> / =<SignedInteger> / =<String> / =<ByteString> / =<Symbol>`` + `Boolean`, `Float`, `Double`, `Signedinteger`, `String`, `Bytestring`, + `Symbol` + PBind*[E = void] {.record: "bind".} = ref object ## ```` + `pattern`*: Pattern[E] + + PAnd*[E = void] {.record: "and".} = ref object ## ```` + `patterns`*: seq[Pattern[E]] + + PNot*[E = void] {.record: "not".} = ref object ## ```` + `pattern`*: Pattern[E] + + PCompound*[E = void] {.record: "compound".} = ref object ## ```` + `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 ## ```` + `template`*: Template[E] + `attenuation`*: Attenuation[E] + + TRef* {.record: "ref".} = ref object ## ```` + `binding`*: BiggestInt + + TCompound*[E = void] {.record: "compound".} = ref object ## ```` + `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 - / =<Boolean> / =<Float> / =<Double> / =<SignedInteger> / =<String> / =<ByteString> / =<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] = + ## ``<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)) diff --git a/src/syndicate/protocols/tcp.nim b/src/syndicate/protocols/tcp.nim new file mode 100644 index 0000000..262032f --- /dev/null +++ b/src/syndicate/protocols/tcp.nim @@ -0,0 +1,55 @@ + +import + std/typetraits, preserves + +type + TcpRemote* {.record: "tcp-remote".} = ref object ## ```` + `host`*: string + `port`*: BiggestInt + + TcpLocal* {.record: "tcp-local".} = ref object ## ```` + `host`*: string + `port`*: BiggestInt + + TcpPeerInfo*[E = void] {.record: "tcp-peer".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/timer.nim b/src/syndicate/protocols/timer.nim new file mode 100644 index 0000000..de974da --- /dev/null +++ b/src/syndicate/protocols/timer.nim @@ -0,0 +1,76 @@ + +import + std/typetraits, preserves + +type + SetTimer*[E = void] {.record: "set-timer".} = ref object ## ```` + `label`*: Preserve[E] + `msecs`*: float64 + `kind`*: TimerKind + + TimerExpired*[E = void] {.record: "timer-expired".} = ref object ## ```` + `label`*: Preserve[E] + `msecs`*: float64 + + TimerKind* {.pure.} = enum ## ``/ =<relative> / =<absolute> / =<clear>`` + `relative`, `absolute`, `clear` + LaterThan* {.record: "later-than".} = ref object ## ```` + `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)) diff --git a/src/syndicate/protocols/transportAddress.nim b/src/syndicate/protocols/transportAddress.nim new file mode 100644 index 0000000..7a75ee4 --- /dev/null +++ b/src/syndicate/protocols/transportAddress.nim @@ -0,0 +1,53 @@ + +import + std/typetraits, preserves + +type + Tcp* {.record: "tcp".} = ref object ## ```` + `host`*: string + `port`*: BiggestInt + + Unix* {.record: "unix".} = ref object ## ```` + `path`*: string + + WebSocket* {.record: "ws".} = ref object ## ```` + `url`*: string + + Stdio* {.record: "stdio".} = object ## ```` + 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)) diff --git a/src/syndicate/protocols/worker.nim b/src/syndicate/protocols/worker.nim new file mode 100644 index 0000000..92d0549 --- /dev/null +++ b/src/syndicate/protocols/worker.nim @@ -0,0 +1,24 @@ + +import + std/typetraits, preserves + +type + Instance*[E = void] {.record: "Instance".} = ref object ## ```` + `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)) diff --git a/tests/box_and_client.prs b/tests/box_and_client.prs deleted file mode 100644 index b642a8a..0000000 --- a/tests/box_and_client.prs +++ /dev/null @@ -1,5 +0,0 @@ -version 1. - -BoxState = . - -SetBox = .