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