From ed6397cd0524af6d6c97299b003101c0e8b88219 Mon Sep 17 00:00:00 2001 From: Luca Cervello Date: Tue, 30 Dec 2025 10:05:20 +0100 Subject: [PATCH] feat: allow colons in bracket parameter syntax closes #748 --- modules/reitit-core/src/reitit/trie.cljc | 10 ++++++++-- test/cljc/reitit/trie_test.cljc | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 061dbeab..32dc29f2 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -71,11 +71,17 @@ (and bracket? (= \{ c)) (let [^long to' (or (str/index-of s "}" to) (ex/fail! ::unclosed-brackets {:path s}))] - (if (= \* (get s (inc to))) + (cond + (= \* (get s (inc to))) (recur (concat ss (-static from to) (-catch-all (inc to) to')) (long (inc to')) (long (inc to'))) + + (= \: (get s (inc to))) + (recur (concat ss (-static from to) (-wild (inc to) to')) (long (inc to')) (long (inc to'))) + + :else (recur (concat ss (-static from to) (-wild to to')) (long (inc to')) (long (inc to'))))) - (and colon? (= \: c)) + (and colon? (= \: c) (not= \{ (get s (dec to)))) (let [^long to' (or (str/index-of s "/" to) (count s))] (if (= 1 (- to' to)) (recur ss from (inc to)) diff --git a/test/cljc/reitit/trie_test.cljc b/test/cljc/reitit/trie_test.cljc index 7b252bc6..cec06ccf 100644 --- a/test/cljc/reitit/trie_test.cljc +++ b/test/cljc/reitit/trie_test.cljc @@ -41,7 +41,9 @@ "/olipa/:kerran/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] "/olipa/{kerran}/avaruus", ["/olipa/{kerran}/avaruus"] + "/olipa/{:kerran}/avaruus", ["/olipa/{:kerran}/avaruus"] "/olipa/{a.b/c}/avaruus", ["/olipa/{a.b/c}/avaruus"] + "/olipa/{:a.b/c}/avaruus", ["/olipa/{:a.b/c}/avaruus"] "/olipa/kerran/*avaruus", ["/olipa/kerran/" (trie/->CatchAll :avaruus)] "/olipa/kerran/{*avaruus}", ["/olipa/kerran/{" (trie/->CatchAll (keyword "avaruus}"))] "/olipa/kerran/{*valtavan.suuri/avaruus}", ["/olipa/kerran/{" (trie/->CatchAll (keyword "valtavan.suuri/avaruus}"))]))) @@ -53,7 +55,9 @@ "/olipa/:kerran/avaruus", ["/olipa/:kerran/avaruus"] "/olipa/{kerran}/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] + "/olipa/{:kerran}/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] "/olipa/{a.b/c}/avaruus", ["/olipa/" (trie/->Wild :a.b/c) "/avaruus"] + "/olipa/{:a.b/c}/avaruus", ["/olipa/" (trie/->Wild :a.b/c) "/avaruus"] "/olipa/kerran/*avaruus", ["/olipa/kerran/*avaruus"] "/olipa/kerran/{*avaruus}", ["/olipa/kerran/" (trie/->CatchAll :avaruus)] "/olipa/kerran/{*valtavan.suuri/avaruus}", ["/olipa/kerran/" (trie/->CatchAll :valtavan.suuri/avaruus)]))) @@ -65,7 +69,9 @@ "/olipa/:kerran/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] "/olipa/{kerran}/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] + "/olipa/{:kerran}/avaruus", ["/olipa/" (trie/->Wild :kerran) "/avaruus"] "/olipa/{a.b/c}/avaruus", ["/olipa/" (trie/->Wild :a.b/c) "/avaruus"] + "/olipa/{:a.b/c}/avaruus", ["/olipa/" (trie/->Wild :a.b/c) "/avaruus"] "/olipa/kerran/*avaruus", ["/olipa/kerran/" (trie/->CatchAll :avaruus)] "/olipa/kerran/{*avaruus}", ["/olipa/kerran/" (trie/->CatchAll :avaruus)] "/olipa/kerran/{*valtavan.suuri/avaruus}", ["/olipa/kerran/" (trie/->CatchAll :valtavan.suuri/avaruus)]))) @@ -77,7 +83,9 @@ "/olipa/:kerran/avaruus", ["/olipa/:kerran/avaruus"] "/olipa/{kerran}/avaruus", ["/olipa/{kerran}/avaruus"] + "/olipa/{:kerran}/avaruus", ["/olipa/{:kerran}/avaruus"] "/olipa/{a.b/c}/avaruus", ["/olipa/{a.b/c}/avaruus"] + "/olipa/{:a.b/c}/avaruus", ["/olipa/{:a.b/c}/avaruus"] "/olipa/kerran/*avaruus", ["/olipa/kerran/*avaruus"] "/olipa/kerran/{*avaruus}", ["/olipa/kerran/{*avaruus}"] "/olipa/kerran/{*valtavan.suuri/avaruus}", ["/olipa/kerran/{*valtavan.suuri/avaruus}"]))))