mirror of
https://github.com/metosin/reitit.git
synced 2025-12-21 01:51:11 +00:00
Polish segment-router
This commit is contained in:
parent
636c7ecd24
commit
ec35c2ebbf
1 changed files with 13 additions and 11 deletions
|
|
@ -12,12 +12,6 @@
|
||||||
(-insert [this ps data])
|
(-insert [this ps data])
|
||||||
(-lookup [this ps params]))
|
(-lookup [this ps params]))
|
||||||
|
|
||||||
(defn- segments [^String path]
|
|
||||||
(mapv
|
|
||||||
(fn [^String p]
|
|
||||||
(if (impl/wild-param? p) (-> p (subs 1) keyword) p))
|
|
||||||
(.split path "/")))
|
|
||||||
|
|
||||||
;; TODO: catch-all
|
;; TODO: catch-all
|
||||||
(defn- segment
|
(defn- segment
|
||||||
([]
|
([]
|
||||||
|
|
@ -29,22 +23,30 @@
|
||||||
(-insert [_ [p & ps] data]
|
(-insert [_ [p & ps] data]
|
||||||
(if-not p
|
(if-not p
|
||||||
(segment children wilds data)
|
(segment children wilds data)
|
||||||
(let [wilds (if (keyword? p) (conj wilds p) wilds)
|
(let [wild (impl/wild-param p)
|
||||||
children (update children p #(-insert (or % (segment)) ps data))]
|
wilds (if wild (conj wilds wild) wilds)
|
||||||
(segment children wilds data))))
|
children (update children (or wild p) #(-insert (or % (segment)) ps data))]
|
||||||
|
(segment children wilds nil))))
|
||||||
(-lookup [_ [p & ps] params]
|
(-lookup [_ [p & ps] params]
|
||||||
(if (nil? p)
|
(if (nil? p)
|
||||||
(assoc data :params params)
|
(if data (assoc data :params params))
|
||||||
(or (-lookup (impl/fast-get children' p) ps params)
|
(or (-lookup (impl/fast-get children' p) ps params)
|
||||||
(some #(-lookup (impl/fast-get children' %) ps (assoc params % p)) wilds))))))))
|
(some #(-lookup (impl/fast-get children' %) ps (assoc params % p)) wilds))))))))
|
||||||
|
|
||||||
(defn create [paths]
|
(defn create [paths]
|
||||||
(reduce
|
(reduce
|
||||||
(fn [segment [p data]]
|
(fn [segment [p data]]
|
||||||
(let [ps (segments p)]
|
(let [ps (impl/segments p)]
|
||||||
(-insert segment ps (map->Match {:data data}))))
|
(-insert segment ps (map->Match {:data data}))))
|
||||||
(segment) paths))
|
(segment) paths))
|
||||||
|
|
||||||
(defn lookup [segment ^String path]
|
(defn lookup [segment ^String path]
|
||||||
(let [ps (.split path "/")]
|
(let [ps (.split path "/")]
|
||||||
(-lookup segment ps {})))
|
(-lookup segment ps {})))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(-> [["/:abba" 1]
|
||||||
|
["/kikka/*kakka" 2]]
|
||||||
|
(create)
|
||||||
|
(lookup "/kikka")
|
||||||
|
(./aprint)))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue