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