import tables
import bindings/quickjs
import js/error
import js/fromjs
import js/javascript
import utils/twtstr
type
Headers* = ref object
table* {.jsget.}: Table[string, seq[string]]
HeadersInitType = enum
HEADERS_INIT_SEQUENCE, HEADERS_INIT_TABLE
HeadersInit* = object
case t: HeadersInitType
of HEADERS_INIT_SEQUENCE:
s: seq[(string, string)]
of HEADERS_INIT_TABLE:
tab: Table[string, string]
jsDestructor(Headers)
proc fromJS2*(ctx: JSContext, val: JSValue, res: var JSResult[HeadersInit]) =
if JS_IsUndefined(val) or JS_IsNull(val):
res.err(nil)
return
if isSequence(ctx, val):
let x = fromJS[seq[(string, string)]](ctx, val)
if x.isSome:
res.ok(HeadersInit(t: HEADERS_INIT_SEQUENCE, s: x.get))
else:
let x = fromJS[Table[string, string]](ctx, val)
if x.isSome:
res.ok(HeadersInit(t: HEADERS_INIT_TABLE, tab: x.get))
proc fill*(headers: Headers, s: seq[(string, string)]) =
for (k, v) in s:
if k in headers.table:
headers.table[k].add(v)
else:
headers.table[k] = @[v]
proc fill*(headers: Headers, tab: Table[string, string]) =
for k, v in tab:
if k in headers.table:
headers.table[k].add(v)
else:
headers.table[k] = @[v]
proc fill*(headers: Headers, init: HeadersInit) =
if init.t == HEADERS_INIT_SEQUENCE:
headers.fill(init.s)
else: # table
headers.fill(init.tab)
func newHeaders*(): Headers =
return Headers()
func newHeaders(obj = none(HeadersInit)): Headers {.jsctor.} =
let headers = Headers()
if obj.isSome:
headers.fill(obj.get)
return headers
func newHeaders*(table: Table[string, string]): Headers =
let headers = Headers()
for k, v in table:
let k = k.toHeaderCase()
if k in headers.table:
headers.table[k].add(v)
else:
headers.table[k] = @[v]
return headers
func clone*(headers: Headers): Headers =
return Headers(
table: headers.table
)
proc add*(headers: var Headers, k, v: string) =
let k = k.toHeaderCase()
if k notin headers.table:
headers.table[k] = @[v]
else:
headers.table[k].add(v)
proc `[]=`*(headers: var Headers, k, v: string) =
headers.table[k.toHeaderCase()] = @[v]
func getOrDefault*(headers: Headers, k: string, default = ""): string =
let k = k.toHeaderCase()
if k in headers.table:
headers.table[k][0]
else:
default
proc addHeadersModule*(ctx: JSContext) =
ctx.registerType(Headers)