about summary refs log tree commit diff stats
path: root/src/types
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-08-11 14:05:15 +0200
committerbptato <nincsnevem662@gmail.com>2024-08-11 14:05:15 +0200
commita0c6f80f76d60bc2bb36942d4162b90e6b5aa2a2 (patch)
treedbf93dc3b168c4a9e135f0fa4e1300892645ba68 /src/types
parentd0910f85adfec4a2cddfe2297be821841f4dd671 (diff)
downloadchawan-a0c6f80f76d60bc2bb36942d4162b90e6b5aa2a2.tar.gz
dom: remove generic JS bindings
Dispatch manually with fromJS instead.
Diffstat (limited to 'src/types')
-rw-r--r--src/types/url.nim36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/types/url.nim b/src/types/url.nim
index 7ecc9531..deeea08b 100644
--- a/src/types/url.nim
+++ b/src/types/url.nim
@@ -6,9 +6,11 @@ import std/tables
 import std/unicode
 
 import lib/punycode
+import monoucha/fromjs
 import monoucha/javascript
 import monoucha/jserror
 import monoucha/libunicode
+import monoucha/quickjs
 import types/blob
 import types/opt
 import utils/luwrap
@@ -1103,27 +1105,27 @@ proc serializeFormURLEncoded*(kvs: seq[(string, string)]; spaceAsPlus = true):
     result &= '='
     result.percentEncode(value, ApplicationXWWWFormUrlEncodedSet, spaceAsPlus)
 
-proc newURLSearchParams[
-      T: seq[(string, string)]|
-      Table[string, string]|
-      string
-    ](init: T = ""): URLSearchParams {.jsctor.} =
-  result = URLSearchParams()
-  when T is seq[(string, string)]:
-    result.list = init
-  elif T is Table[string, string]:
-    for k, v in init:
-      result.list.add((k, v))
-  elif T is string:
-    let init = if init.len > 0 and init[0] == '?':
-      init.substr(1)
+proc newURLSearchParams(ctx: JSContext; init: varargs[JSValue]):
+    Opt[URLSearchParams] {.jsctor.} =
+  let params = URLSearchParams()
+  if init.len > 0:
+    let val = init[0]
+    if ctx.fromJS(val, params.list).isSome:
+      discard
+    elif (var t: Table[string, string]; ctx.fromJS(val, t).isSome):
+      for k, v in t:
+        params.list.add((k, v))
     else:
-      init
-    result.list = parseFromURLEncoded(init)
+      var res: string
+      ?ctx.fromJS(val, res)
+      if res.len > 0 and res[0] == '?':
+        res.delete(0..0)
+      params.list = parseFromURLEncoded(res)
+  return ok(params)
 
 proc searchParams(url: URL): URLSearchParams {.jsfget.} =
   if url.searchParamsInternal == nil:
-    let params = newURLSearchParams(url.query.get(""))
+    let params = URLSearchParams(list: parseFromURLEncoded(url.query.get("")))
     params.url = url
     url.searchParamsInternal = params
   return url.searchParamsInternal