import std/typetraits, preserves, std/tables type Path* = seq[string] Headers* = Table[string, seq[string]] Response* {.preservesRecord: "http".} = object `handle`*: BiggestInt `code`*: BiggestInt `headers`*: Headers `body`*: string Listener* {.preservesRecord: "listen".} = object `port`*: BiggestInt Handler* {.preservesRecord: "handler".} = object `methods`*: Methods `path`*: Path `entity`* {.preservesEmbedded.}: Preserve[void] `Method`* {.preservesOr, pure.} = enum `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS`, `TRACE`, `PATCH` Request* {.preservesRecord: "http".} = object `handle`*: BiggestInt `method`*: Method `headers`*: Headers `path`*: Path `body`*: string Methods* = set[Method] proc `$`*(x: Path | Headers | Response | Listener | Handler | Request | Methods): string = `$`(toPreserve(x)) proc encode*(x: Path | Headers | Response | Listener | Handler | Request | Methods): seq[byte] = encode(toPreserve(x))