Skip to content

Commit 5972ea6

Browse files
committed
Merge pull request #13 from Deraen/fix-default-query-params
Fix default query params
2 parents e7d17bc + 8509bd0 commit 5972ea6

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

spec/domkm/silk_spec.cljx

+12-4
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,8 @@
280280
(silk/routes [[:id2 [["foo" "bar" :baz]]]])
281281
[:id3 [nil {"a" :b}]]
282282
[:id4 [["search"] {"q" (silk/? :q {:q "default"})}]]
283-
[:id5 [["users"] {"q" (silk/? :q)}]]]))
283+
[:id5 [["users"] {"q" (silk/? :q)}]]
284+
[:id6 [["test"] {"q" (silk/? (silk/int :q))}]]]))
284285
(spec/with-all clean-params
285286
#(dissoc % :domkm.silk/routes :domkm.silk/url :domkm.silk/pattern :domkm.silk/name))
286287
(spec/it
@@ -303,7 +304,9 @@
303304
(spec/it
304305
"unmatches successfully"
305306
(spec/should= (silk/map->URL {:query {"a" "c"}})
306-
(silk/unmatch @routes {:domkm.silk/name :id3 :b "c"})))
307+
(silk/unmatch @routes {:domkm.silk/name :id3 :b "c"}))
308+
(spec/should= (silk/map->URL {:path ["test"] :query {"q" nil}})
309+
(silk/unmatch @routes {:domkm.silk/name :id6})))
307310
(spec/it
308311
"unmatches unsuccessfully"
309312
(spec/should-throw AssertionError (silk/unmatch @routes {})))
@@ -326,7 +329,10 @@
326329
(silk/arrive @routes "/users")))
327330
(spec/should= {:q "bar"}
328331
(@clean-params
329-
(silk/arrive @routes "/users?q=bar"))))
332+
(silk/arrive @routes "/users?q=bar")))
333+
(spec/should= {:q nil}
334+
(@clean-params
335+
(silk/arrive @routes "/test"))))
330336
(spec/it
331337
"departs"
332338
(spec/should= "/foo/bar/bloop"
@@ -340,4 +346,6 @@
340346
(spec/should= "/users"
341347
(silk/depart @routes :id5))
342348
(spec/should= "/users?q=bar"
343-
(silk/depart @routes :id5 {:q "bar"})))))
349+
(silk/depart @routes :id5 {:q "bar"}))
350+
(spec/should= "/test"
351+
(silk/depart @routes :id6)))))

src/domkm/silk.cljx

+25-9
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,22 @@
9595
(-match [this that])
9696
(-unmatch [this params])
9797
(-match-validator [this])
98-
(-unmatch-validators [this]))
98+
(-unmatch-validators [this])
99+
(-create-default [this v]))
99100

100101
(defn pattern? [x]
101102
(satisfies? Pattern x))
102103

104+
(defn- optional-value-is-allowed [validator]
105+
(fn [x]
106+
(if (= x ::optional-key-has-no-value)
107+
true
108+
(validator x))))
109+
103110
(defn match-validator [ptrn]
104111
{:pre [(pattern? ptrn)]
105112
:post [(fn? %)]}
106-
(-match-validator ptrn))
113+
(optional-value-is-allowed (-match-validator ptrn)))
107114

108115
(defn unmatch-validators [ptrn]
109116
{:pre [(pattern? ptrn)]
@@ -134,6 +141,10 @@
134141
:post [(match-valid? ptrn %)]}
135142
(-unmatch ptrn params))
136143

144+
(defn create-default
145+
([ptrn] (create-default ptrn nil))
146+
([ptrn v] (-create-default ptrn v)))
147+
137148

138149
;;;; Native Patterns ;;;;
139150

@@ -158,7 +169,9 @@
158169
(-match-validator [_]
159170
some?)
160171
(-unmatch-validators [this]
161-
{this some?}))
172+
{this some?})
173+
(-create-default [this v]
174+
{this v}))
162175

163176
(defn ^:private match-coll [ks %1s %2s]
164177
(loop [ks ks
@@ -229,13 +242,16 @@
229242
deserialize
230243
(hash-map param-key)))
231244
(-unmatch [_ params]
232-
(->> param-key
233-
(get params)
234-
serialize))
245+
(let [v (get params param-key)]
246+
(if (= v ::optional-key-has-no-value)
247+
v
248+
(serialize v))))
235249
(-match-validator [_]
236250
string?)
237251
(-unmatch-validators [_]
238-
{param-key validate}))
252+
{param-key (optional-value-is-allowed validate)})
253+
(-create-default [_ v]
254+
(create-default param-key v)))
239255

240256
(defn regex
241257
([k re]
@@ -316,7 +332,7 @@
316332
Pattern
317333
(-match [_ that]
318334
(if (nil? that)
319-
(or default-params {ptrn nil})
335+
(or default-params (create-default ptrn))
320336
(match ptrn that)))
321337
(-unmatch [_ params]
322338
(let [r (unmatch ptrn
@@ -325,7 +341,7 @@
325341
dval
326342
pval))
327343
params
328-
(or default-params {ptrn ::optional-key-has-no-value})))]
344+
(or default-params (create-default ptrn ::optional-key-has-no-value))))]
329345
(if-not (= ::optional-key-has-no-value r)
330346
r)))
331347
(-match-validator [_]

0 commit comments

Comments
 (0)