syndicate-nim/src/syndicate/protocols/service.nim

61 lines
1.8 KiB
Nim

import
std/typetraits, preserves
type
StateKind* {.pure.} = enum
`started`, `ready`, `failed`, `complete`, `userDefined`
StateUserDefined*[Cap] = Preserve[Cap]
`State`*[Cap] {.preservesOr.} = object
case orKind*: StateKind
of StateKind.`started`:
`started`* {.preservesLiteral: "started".}: bool
of StateKind.`ready`:
`ready`* {.preservesLiteral: "ready".}: bool
of StateKind.`failed`:
`failed`* {.preservesLiteral: "failed".}: bool
of StateKind.`complete`:
`complete`* {.preservesLiteral: "complete".}: bool
of StateKind.`userDefined`:
`userdefined`*: StateUserDefined[Cap]
ServiceObject*[Cap] {.preservesRecord: "service-object".} = object
`serviceName`*: Preserve[Cap]
`object`*: Preserve[Cap]
RequireService*[Cap] {.preservesRecord: "require-service".} = object
`serviceName`*: Preserve[Cap]
RestartService*[Cap] {.preservesRecord: "restart-service".} = object
`serviceName`*: Preserve[Cap]
RunService*[Cap] {.preservesRecord: "run-service".} = object
`serviceName`*: Preserve[Cap]
ServiceState*[Cap] {.preservesRecord: "service-state".} = object
`serviceName`*: Preserve[Cap]
`state`*: State[Cap]
ServiceDependency*[Cap] {.preservesRecord: "depends-on".} = object
`depender`*: Preserve[Cap]
`dependee`*: ServiceState[Cap]
proc `$`*[Cap](x: State[Cap] | ServiceObject[Cap] | RequireService[Cap] |
RestartService[Cap] |
RunService[Cap] |
ServiceState[Cap] |
ServiceDependency[Cap]): string =
`$`(toPreserve(x, Cap))
proc encode*[Cap](x: State[Cap] | ServiceObject[Cap] | RequireService[Cap] |
RestartService[Cap] |
RunService[Cap] |
ServiceState[Cap] |
ServiceDependency[Cap]): seq[byte] =
encode(toPreserve(x, Cap))