Merge pull request #576 from bsless/coercion-errors-perf

Coercion errors perf
This commit is contained in:
Tommi Reiman 2022-12-13 23:01:44 +02:00 committed by GitHub
commit f449bf848d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 24 deletions

View file

@ -41,36 +41,44 @@
:header (->ParameterCoercion :headers :string true true) :header (->ParameterCoercion :headers :string true true)
:path (->ParameterCoercion :path-params :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 (throw
(ex-info (ex-info
(str "Request coercion failed: " (pr-str result)) (if serialize-failed-result
(merge (str "Request coercion failed: " (pr-str result))
(into {} result) "Request coercion failed")
{:type ::request-coercion (-> {}
:coercion coercion transient
:value value (as-> $ (reduce conj! $ result))
:in [:request in] (assoc! :type ::request-coercion)
:request request})))) (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] (defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result]
(throw (throw
(ex-info (ex-info
(str "Response coercion failed: " (pr-str result)) (if serialize-failed-result
(merge (str "Response coercion failed: " (pr-str result))
(into {} result) "Response coercion failed")
{:type ::response-coercion (-> {}
:coercion coercion transient
:value value (as-> $ (reduce conj! $ result))
:in [:response :body] (assoc! :type ::response-coercion)
:request request (assoc! :coercion coercion)
:response response})))) (assoc! :value value)
(assoc! :in [:response :body])
(assoc! :request request)
(assoc! :response response)
persistent!))))
(defn extract-request-format-default [request] (defn extract-request-format-default [request]
(-> request :muuntaja/request :format)) (-> request :muuntaja/request :format))
;; TODO: support faster key walking, walk/keywordize-keys is quite slow... ;; 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 :or {extract-request-format extract-request-format-default
parameter-coercion default-parameter-coercion}}] parameter-coercion default-parameter-coercion}}]
(if coercion (if coercion
@ -83,13 +91,13 @@
format (extract-request-format request) format (extract-request-format request)
result (coercer value format)] result (coercer value format)]
(if (error? result) (if (error? result)
(request-coercion-failed! result coercion value in request) (request-coercion-failed! result coercion value in request serialize-failed-result)
result)))))))) result))))))))
(defn extract-response-format-default [request _] (defn extract-response-format-default [request _]
(-> request :muuntaja/response :format)) (-> 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}}] :or {extract-response-format extract-response-format-default}}]
(if coercion (if coercion
(if-let [coercer (-response-coercer coercion body)] (if-let [coercer (-response-coercer coercion body)]
@ -98,7 +106,7 @@
value (:body response) value (:body response)
result (coercer value format)] result (coercer value format)]
(if (error? result) (if (error? result)
(response-coercion-failed! result coercion value request response) (response-coercion-failed! result coercion value request response serialize-failed-result)
result)))))) result))))))
(defn encode-error [data] (defn encode-error [data]

View file

@ -114,7 +114,7 @@
:response {:default default-transformer-provider :response {:default default-transformer-provider
:formats {"application/json" json-transformer-provider}}} :formats {"application/json" json-transformer-provider}}}
;; set of keys to include in error messages ;; 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? ;; support lite syntax?
:lite true :lite true
;; schema identity function (default: close all map schemas) ;; schema identity function (default: close all map schemas)