-
-
Notifications
You must be signed in to change notification settings - Fork 31
/
url.clj
63 lines (49 loc) · 1.32 KB
/
url.clj
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
(ns qbits.spandex.url
(:require
[ring.util.codec :as codec]))
(declare x-fragment-interpose-comma
x-fragment-interpose-slash)
(defprotocol URL
(encode [x]))
(defprotocol URLFragment
(encode-fragment [value]))
(defn ^:no-doc string-builder
([] (StringBuilder.))
([^StringBuilder sb x] (.append sb x))
([^StringBuilder sb] (.toString sb)))
(defn ^:no-doc url-string-builder
([] (StringBuilder. "/"))
([^StringBuilder sb x] (.append sb x))
([^StringBuilder sb] (.toString sb)))
(extend-protocol URLFragment
clojure.lang.Sequential
(encode-fragment [value]
;; multi index fragment
(transduce x-fragment-interpose-comma string-builder value))
clojure.lang.Keyword
(encode-fragment [value]
(encode-fragment (name value)))
String
(encode-fragment [s]
(codec/url-encode s))
Object
(encode-fragment [value]
(encode-fragment (str value))))
(def ^:no-doc x-fragment-interpose-comma
(comp (remove nil?)
(map encode-fragment)
(interpose ",")))
(def ^:no-doc x-fragment-interpose-slash
(comp (remove nil?)
(map encode-fragment)
(interpose "/")))
(extend-protocol URL
String
(encode [s] s)
Object
(encode [parts]
(transduce x-fragment-interpose-slash
url-string-builder
parts))
nil
(encode [_] "/"))