syndicate-nim/src/sam/protocols/dataspacePatterns.nim

87 lines
2.1 KiB
Nim
Raw Normal View History

import
2023-05-18 10:20:44 +00:00
preserves, std/tables
type
AnyAtomKind* {.pure.} = enum
2024-02-08 15:25:31 +00:00
`bool`, `double`, `int`, `string`, `bytes`, `symbol`, `embedded`
2023-12-31 17:15:06 +00:00
`AnyAtom`* {.preservesOr.} = object
case orKind*: AnyAtomKind
of AnyAtomKind.`bool`:
2024-01-07 22:11:59 +00:00
`bool`*: bool
of AnyAtomKind.`double`:
2024-02-08 15:25:31 +00:00
`double`*: float
of AnyAtomKind.`int`:
2024-01-07 22:11:59 +00:00
`int`*: BiggestInt
of AnyAtomKind.`string`:
2024-01-07 22:11:59 +00:00
`string`*: string
of AnyAtomKind.`bytes`:
2024-01-07 22:11:59 +00:00
`bytes`*: seq[byte]
of AnyAtomKind.`symbol`:
2024-01-07 22:11:59 +00:00
`symbol`*: Symbol
of AnyAtomKind.`embedded`:
2024-01-07 22:11:59 +00:00
`embedded`* {.preservesEmbedded.}: EmbeddedRef
2023-12-31 17:15:06 +00:00
DLit* {.preservesRecord: "lit".} = object
`value`*: AnyAtom
2023-12-31 17:15:06 +00:00
DBind* {.preservesRecord: "bind".} = object
`pattern`*: Pattern
2021-09-24 19:25:47 +00:00
DDiscard* {.preservesRecord: "_".} = object
2021-11-03 18:21:52 +00:00
2021-09-24 19:25:47 +00:00
DCompoundKind* {.pure.} = enum
`rec`, `arr`, `dict`
2023-12-31 17:15:06 +00:00
DCompoundRec* {.preservesRecord: "rec".} = object
`label`*: Value
`fields`*: seq[Pattern]
2023-12-31 17:15:06 +00:00
DCompoundArr* {.preservesRecord: "arr".} = object
`items`*: seq[Pattern]
2023-12-31 17:15:06 +00:00
DCompoundDict* {.preservesRecord: "dict".} = object
`entries`*: Table[Value, Pattern]
2023-12-31 17:15:06 +00:00
`DCompound`* {.preservesOr.} = object
2021-09-24 19:25:47 +00:00
case orKind*: DCompoundKind
of DCompoundKind.`rec`:
2024-01-07 22:11:59 +00:00
`rec`* {.preservesEmbedded.}: DCompoundRec
2021-09-24 19:25:47 +00:00
of DCompoundKind.`arr`:
2024-01-07 22:11:59 +00:00
`arr`* {.preservesEmbedded.}: DCompoundArr
2021-09-24 19:25:47 +00:00
of DCompoundKind.`dict`:
2024-01-07 22:11:59 +00:00
`dict`* {.preservesEmbedded.}: DCompoundDict
2021-09-24 19:25:47 +00:00
PatternKind* {.pure.} = enum
`DDiscard`, `DBind`, `DLit`, `DCompound`
2023-12-31 17:15:06 +00:00
`Pattern`* {.acyclic, preservesOr.} = ref object
2021-09-24 19:25:47 +00:00
case orKind*: PatternKind
of PatternKind.`DDiscard`:
`ddiscard`*: DDiscard
2021-09-24 19:25:47 +00:00
of PatternKind.`DBind`:
2024-01-07 22:11:59 +00:00
`dbind`* {.preservesEmbedded.}: DBind
2021-09-24 19:25:47 +00:00
of PatternKind.`DLit`:
2024-01-07 22:11:59 +00:00
`dlit`* {.preservesEmbedded.}: DLit
2021-09-24 19:25:47 +00:00
of PatternKind.`DCompound`:
2024-01-07 22:11:59 +00:00
`dcompound`* {.preservesEmbedded.}: DCompound
2021-09-24 19:25:47 +00:00
2023-12-31 17:15:06 +00:00
proc `$`*(x: AnyAtom | DLit | DBind | DDiscard | DCompound | Pattern): string =
`$`(toPreserves(x))
2023-12-31 17:15:06 +00:00
proc encode*(x: AnyAtom | DLit | DBind | DDiscard | DCompound | Pattern): seq[
byte] =
encode(toPreserves(x))