mirror of
https://github.com/metosin/reitit.git
synced 2025-12-18 08:51:12 +00:00
Merge pull request #576 from bsless/coercion-errors-perf
Coercion errors perf
This commit is contained in:
commit
f449bf848d
2 changed files with 32 additions and 24 deletions
|
|
@ -41,36 +41,44 @@
|
|||
: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
|
||||
(if serialize-failed-result
|
||||
(str "Request coercion failed: " (pr-str result))
|
||||
(merge
|
||||
(into {} result)
|
||||
{:type ::request-coercion
|
||||
:coercion coercion
|
||||
:value value
|
||||
:in [:request in]
|
||||
:request request}))))
|
||||
"Request coercion failed")
|
||||
(-> {}
|
||||
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]
|
||||
(defn ^:no-doc response-coercion-failed! [result coercion value request response serialize-failed-result]
|
||||
(throw
|
||||
(ex-info
|
||||
(if serialize-failed-result
|
||||
(str "Response coercion failed: " (pr-str result))
|
||||
(merge
|
||||
(into {} result)
|
||||
{:type ::response-coercion
|
||||
:coercion coercion
|
||||
:value value
|
||||
:in [:response :body]
|
||||
:request request
|
||||
:response response}))))
|
||||
"Response coercion failed")
|
||||
(-> {}
|
||||
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))
|
||||
|
||||
;; 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 +91,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 +106,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]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue