-
Notifications
You must be signed in to change notification settings - Fork 17
/
params.clj
69 lines (55 loc) · 2.53 KB
/
params.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
64
65
66
67
68
69
(ns halboy.params
(:require
[clojure.walk :refer [postwalk]]
[clojure.set :refer [difference]]
[medley.core :refer [map-vals]]
[uritemplate-clj.core :refer [uritemplate tokenize parse-token]]
[org.bovinegenius.exploding-fish :as uri]))
(defn- stringify-params [params]
(let [f (fn [x]
(cond
(vector? x) x
(map? x) (into {} (map (fn [[k v]] [(name k) v]) x))
(keyword? x) (name x)
:else (str x)))]
(postwalk f params)))
(defn- extract-template-variable-names [templated-uri]
(let [tokens (tokenize templated-uri)
tokens-with-variables (filter #(= \{ (first %)) tokens)
parsed-tokens-with-variables (map parse-token tokens-with-variables)
variables (mapcat :variables parsed-tokens-with-variables)
variable-names (map :text variables)]
variable-names))
(defn- expand-template [templated-uri params]
(uritemplate templated-uri params))
(defn- extract-query-params [uri]
(let [pairs (uri/query-pairs uri)
grouped-pairs (group-by first pairs)
accumulated-pairs (map-vals
#(if (= 1 (count %))
(second (first %))
(mapv second %))
grouped-pairs)]
(into {} accumulated-pairs)))
(defn- remove-query-params [uri]
(-> uri (uri/uri) (dissoc :query) (str)))
(defn- determine-remaining-param-names [params template-variable-names]
(difference (set (keys params)) (set template-variable-names)))
(defn- determine-full-query-params
[params remaining-param-names expanded-uri-query-params]
(merge (select-keys params remaining-param-names)
expanded-uri-query-params))
(defn build-query [templated-uri params]
(let [stringified-params (stringify-params params)
template-variable-names (extract-template-variable-names templated-uri)
expanded-uri (expand-template templated-uri stringified-params)
expanded-uri-query-params (extract-query-params expanded-uri)
expanded-uri-without-query-params (remove-query-params expanded-uri)
remaining-param-names (determine-remaining-param-names
stringified-params template-variable-names)
full-query-params (determine-full-query-params
stringified-params
remaining-param-names
expanded-uri-query-params)]
{:href expanded-uri-without-query-params
:query-params full-query-params}))