Better errors for route-data merge errors

This commit is contained in:
Tommi Reiman 2019-05-15 22:54:35 +03:00
parent 9a75219443
commit ad0bc7e013
4 changed files with 40 additions and 5 deletions

View file

@ -35,3 +35,6 @@
(fn [[name vals]]
(str name "\n-> " (str/join "\n-> " (mapv first vals)) "\n"))
conflicts)))
(defmethod format-exception :reitit.impl/merge-data [_ _ data]
(str "Error merging route-data\n\n" (pr-str data)))

View file

@ -4,7 +4,8 @@
[clojure.set :as set]
[meta-merge.core :as mm]
[reitit.trie :as trie]
[reitit.exception :as exception])
[reitit.exception :as exception]
[reitit.exception :as ex])
#?(:clj
(:import (java.util.regex Pattern)
(java.util HashMap Map)
@ -58,12 +59,15 @@
(walk-one path (mapv identity data) raw-routes)))
(defn map-data [f routes]
(mapv #(update % 1 f) routes))
(mapv (fn [[p ds]] [p (f p ds)]) routes))
(defn merge-data [x]
(defn merge-data [p x]
(reduce
(fn [acc [k v]]
(mm/meta-merge acc {k v}))
(try
(mm/meta-merge acc {k v})
(catch #?(:clj Exception, :cljs js/Error) e
(ex/fail! ::merge-data {:path p, :left acc, :right {k v}, :exception e}))))
{} x))
(defn resolve-routes [raw-routes {:keys [coerce] :as opts}]

View file

@ -335,3 +335,27 @@
problems))
(color :white "https://cljdoc.org/d/metosin/reitit/CURRENT/doc/basics/route-data-validation")
[:break]])
(defmethod format-exception :reitit.impl/merge-data [_ _ {:keys [path left right exception]}]
[:group
(text "Error merging route-data:")
[:break] [:break]
[:group
[:span (color :grey "-- On route -----------------------")]
[:break]
[:break]
(text path)
[:break]
[:break]
[:span (color :grey "-- Exception ----------------------")]
[:break]
[:break]
(color :red (ex-message exception))
[:break]
[:break]
(edn left {:margin 3})
[:break]
(edn right {:margin 3})]
[:break]
(color :white "https://cljdoc.org/d/metosin/reitit/0.3.1/doc/basics/route-data")
[:break]])

View file

@ -43,7 +43,11 @@
["/api/{ipa"]
#"Invalid route data"
["/api/ipa" {::roles #{:adminz}}])
["/api/ipa" {::roles #{:adminz}}]
#"Error merging route-data"
["/a" {:body {}}
["/b" {:body [:FAIL]}]])
exception/exception
pretty/exception))