122 lines
5.0 KiB
Nim
122 lines
5.0 KiB
Nim
|
|
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))
|