From bc4443a935836b315cf2a7971b24f37dbca74db9 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:20:48 +0200 Subject: [PATCH 1/3] Remove schema and errors from default malli coercion error keys --- modules/reitit-malli/src/reitit/coercion/malli.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/reitit-malli/src/reitit/coercion/malli.cljc b/modules/reitit-malli/src/reitit/coercion/malli.cljc index a57d2641..e7b2607c 100644 --- a/modules/reitit-malli/src/reitit/coercion/malli.cljc +++ b/modules/reitit-malli/src/reitit/coercion/malli.cljc @@ -114,7 +114,7 @@ :response {:default default-transformer-provider :formats {"application/json" json-transformer-provider}}} ;; set of keys to include in error messages - :error-keys #{:type :coercion :in :schema :value :errors :humanized #_:transformed} + :error-keys #{:type :coercion :in #_:schema :value #_:errors :humanized #_:transformed} ;; support lite syntax? :lite true ;; schema identity function (default: close all map schemas) From 8398c985956a59197736b5625110d2bf54c13fdc Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:34:13 +0200 Subject: [PATCH 2/3] Add serialize-failed-result coercion option False by default, if true will serialize the failed coercion result in the error message --- modules/reitit-core/src/reitit/coercion.cljc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 0fd5d234..27fe6159 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -41,10 +41,12 @@ :header (->ParameterCoercion :headers :string true true) :path (->ParameterCoercion :path-params :string true true)}) -(defn ^:no-doc request-coercion-failed! [result coercion value in request] +(defn ^:no-doc request-coercion-failed! [result coercion value in request serialize-failed-result] (throw (ex-info - (str "Request coercion failed: " (pr-str result)) + (if serialize-failed-result + (str "Request coercion failed: " (pr-str result)) + "Request coercion failed") (merge (into {} result) {:type ::request-coercion @@ -53,10 +55,12 @@ :in [:request in] :request request})))) -(defn ^:no-doc response-coercion-failed! [result coercion value request response] +(defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result] (throw (ex-info - (str "Response coercion failed: " (pr-str result)) + (if serialize-failed-result + (str "Response coercion failed: " (pr-str result)) + "Response coercion failed") (merge (into {} result) {:type ::response-coercion @@ -70,7 +74,7 @@ (-> request :muuntaja/request :format)) ;; TODO: support faster key walking, walk/keywordize-keys is quite slow... -(defn request-coercer [coercion type model {::keys [extract-request-format parameter-coercion] +(defn request-coercer [coercion type model {::keys [extract-request-format parameter-coercion serialize-failed-result] :or {extract-request-format extract-request-format-default parameter-coercion default-parameter-coercion}}] (if coercion @@ -83,13 +87,13 @@ format (extract-request-format request) result (coercer value format)] (if (error? result) - (request-coercion-failed! result coercion value in request) + (request-coercion-failed! result coercion value in request serialize-failed-result) result)))))))) (defn extract-response-format-default [request _] (-> request :muuntaja/response :format)) -(defn response-coercer [coercion body {:keys [extract-response-format] +(defn response-coercer [coercion body {:keys [extract-response-format serialize-failed-result] :or {extract-response-format extract-response-format-default}}] (if coercion (if-let [coercer (-response-coercer coercion body)] @@ -98,7 +102,7 @@ value (:body response) result (coercer value format)] (if (error? result) - (response-coercion-failed! result coercion value request response) + (response-coercion-failed! result coercion value request response serialize-failed-result) result)))))) (defn encode-error [data] From 24f38e0dfa24998c8f6dce98db886c010b307d47 Mon Sep 17 00:00:00 2001 From: Ben Sless Date: Tue, 6 Dec 2022 21:35:26 +0200 Subject: [PATCH 3/3] Unroll merge and hash-map coercion --- modules/reitit-core/src/reitit/coercion.cljc | 34 +++++++++++--------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/reitit-core/src/reitit/coercion.cljc b/modules/reitit-core/src/reitit/coercion.cljc index 27fe6159..4436214c 100644 --- a/modules/reitit-core/src/reitit/coercion.cljc +++ b/modules/reitit-core/src/reitit/coercion.cljc @@ -47,13 +47,15 @@ (if serialize-failed-result (str "Request coercion failed: " (pr-str result)) "Request coercion failed") - (merge - (into {} result) - {:type ::request-coercion - :coercion coercion - :value value - :in [:request in] - :request request})))) + (-> {} + transient + (as-> $ (reduce conj! $ result)) + (assoc! :type ::request-coercion) + (assoc! :coercion coercion) + (assoc! :value value) + (assoc! :in [:request in]) + (assoc! :request request) + persistent!)))) (defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result] (throw @@ -61,14 +63,16 @@ (if serialize-failed-result (str "Response coercion failed: " (pr-str result)) "Response coercion failed") - (merge - (into {} result) - {:type ::response-coercion - :coercion coercion - :value value - :in [:response :body] - :request request - :response response})))) + (-> {} + transient + (as-> $ (reduce conj! $ result)) + (assoc! :type ::response-coercion) + (assoc! :coercion coercion) + (assoc! :value value) + (assoc! :in [:response :body]) + (assoc! :request request) + (assoc! :response response) + persistent!)))) (defn extract-request-format-default [request] (-> request :muuntaja/request :format))