diff --git a/src/reitit/core.cljc b/src/reitit/core.cljc index 8db5a4e5..dd03a71f 100644 --- a/src/reitit/core.cljc +++ b/src/reitit/core.cljc @@ -69,10 +69,19 @@ (reduced (assoc m :route-params params)))) nil routes))) +(defrecord LookupRouter [routes] + Routing + (match-route [_ path] + (routes path))) + (defn router ([data] (router data {})) ([data opts] - (->LinearRouter - (for [[p m] (resolve-routes data opts)] - [p m (regex/matcher p)])))) + (let [routes (resolve-routes data opts)] + (if (some regex/contains-wilds? (map first routes)) + (->LinearRouter + (for [[p m] routes] + [p m (regex/matcher p)])) + (->LookupRouter + (into {} routes)))))) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 1861f5a0..6725fc09 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -1,9 +1,26 @@ (ns reitit.core-test (:require [clojure.test :refer [deftest testing is are]] - [reitit.core :as reitit])) + #?(:clj [reitit.core :as reitit] + :cljs [reitit.core :as reitit :refer [LinearRouter LookupRouter]])) + #?(:clj + (:import (reitit.core LinearRouter LookupRouter)))) (deftest reitit-test + (testing "linear router" + (let [router (reitit/router ["/api" + ["/ipa" + ["/:size"]]])] + (is (instance? LinearRouter router)) + (is (map? (reitit/match-route router "/api/ipa/large"))))) + + (testing "lookup router" + (let [router (reitit/router ["/api" + ["/ipa" + ["/large"]]])] + (is (instance? LookupRouter router)) + (is (map? (reitit/match-route router "/api/ipa/large"))))) + (testing "bide sample" (let [routes [["/auth/login" :auth/login] ["/auth/recovery/token/:token" :auth/recovery]