- Notifications
You must be signed in to change notification settings - Fork 1.5k
/
Copy pathjsheaders.nim
83 lines (64 loc) · 3.42 KB
/
jsheaders.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
## - HTTP Headers for the JavaScript target: https://developer.mozilla.org/en-US/docs/Web/API/Headers
whennotdefined(js):
{.fatal: "Module jsheaders is designed to be used with the JavaScript backend.".}
typeHeaders*=refobjectofJsRoot## HTTP Headers API.
funcnewHeaders*(): Headers {.importjs: "new Headers()".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers
funcadd*(self: Headers; key: cstring; value: cstring) {.importjs: "#.append(#, #)".}
## Allows duplicated keys.
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/append
funcdelete*(self: Headers; key: cstring) {.importjs: "#.$1(#)".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/delete
##
## .. warning:: Delete *all* items with `key` from the headers, including duplicated keys.
funchasKey*(self: Headers; key: cstring): bool {.importjs: "#.has(#)".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/has
funckeys*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/keys
funcvalues*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/values
funcentries*(self: Headers): seq[tuple[key, value: cstring]] {.importjs: "Array.from(#.$1())".}
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/entries
func`[]`*(self: Headers; key: cstring): cstring {.importjs: "#.get(#)".}
## Get *all* items with `key` from the headers, including duplicated values.
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/get
func`[]=`*(self: Headers; key: cstring; value: cstring) {.importjs: "#.set(#, #)".}
## Do *not* allow duplicated keys, overwrites duplicated keys.
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
funcclear*(self: Headers) {.importjs:
"(() => { const header = #; Array.from(header.keys()).forEach((key) => header.delete(key)) })()".}
## Convenience func to delete all items from `Headers`.
functoCstring*(self: Headers): cstring {.importjs: "JSON.stringify(Array.from(#.entries()))".}
## Returns a `cstring` representation of `Headers`.
func`$`*(self: Headers): string=$toCstring(self)
funclen*(self: Headers): int {.importjs: "Array.from(#.entries()).length".}
runnableExamples("-r:off"):
block:
let header: Headers=newHeaders()
header.add("key", "value")
assert header.hasKey("key")
assert header.keys() ==@["key".cstring]
assert header.values() ==@["value".cstring]
assert header["key"] =="value".cstring
header["other"] ="another".cstring
assert header["other"] =="another".cstring
assert header.entries() ==@[("key".cstring, "value".cstring), ("other".cstring, "another".cstring)]
assert header.toCstring() =="""[["key","value"],["other","another"]]""".cstring
header.delete("other")
assert header.entries() ==@[("key".cstring, "value".cstring)]
header.clear()
assert header.entries() ==@[]
assert header.len ==0
block:
let header: Headers=newHeaders()
header.add("key", "a")
header.add("key", "b") ## Duplicated.
header.add("key", "c") ## Duplicated.
assert header["key"] =="a, b, c".cstring
header["key"] ="value".cstring
assert header["key"] =="value".cstring
block:
let header: Headers=newHeaders()
header["key"] ="a"
header["key"] ="b"## Overwrites.
assert header["key"] =="b".cstring