|
7 | 7 | [plumbing.core :refer :all] |
8 | 8 | [plumbing.fnk.impl :as fnk-impl] |
9 | 9 | [ring.swagger.common :refer :all] |
10 | | - [ring.swagger.schema :as schema] |
11 | 10 | [ring.swagger.json-schema :as js] |
12 | 11 | [ring.util.http-response :refer [internal-server-error]] |
13 | 12 | [slingshot.slingshot :refer [throw+]] |
14 | 13 | [schema.core :as s] |
| 14 | + [schema.coerce :as sc] |
| 15 | + [schema.utils :as su] |
15 | 16 | [schema-tools.core :as st])) |
16 | 17 |
|
17 | 18 | ;; |
|
23 | 24 | '+compojure-api-request+) |
24 | 25 |
|
25 | 26 | (def +compojure-api-meta+ |
26 | | - "lexically bound meta-data for handlers. EXPERIMENTAL." |
| 27 | + "lexically bound meta-data for handlers." |
27 | 28 | '+compojure-api-meta+) |
28 | 29 |
|
29 | 30 | (defmacro meta-container [meta & form] |
|
46 | 47 | ;; Schema |
47 | 48 | ;; |
48 | 49 |
|
| 50 | +(def memoized-coercer (memoize sc/coercer)) |
| 51 | + |
49 | 52 | (defn strict [schema] |
50 | 53 | (dissoc schema 'schema.core/Keyword)) |
51 | 54 |
|
|
59 | 62 | (if-let [{:keys [status] :as response} (handler request)] |
60 | 63 | (if-let [schema (:schema (responses status))] |
61 | 64 | (if-let [matcher (:response (mw/get-coercion-matcher-provider request))] |
62 | | - (let [body (schema/coerce schema (:body response) matcher)] |
63 | | - (if (schema/error? body) |
| 65 | + (let [coerce (memoized-coercer (value-of schema) matcher) |
| 66 | + body (coerce (:body response))] |
| 67 | + (if (su/error? body) |
64 | 68 | (throw+ (assoc body :type ::ex/response-validation)) |
65 | 69 | (assoc response |
66 | 70 | ::serializable? true |
|
75 | 79 | (assert (not (#{:query :json} type)) (str type " is DEPRECATED since 0.22.0. Use :body or :string instead.")) |
76 | 80 | `(let [value# (keywordize-keys (~key ~+compojure-api-request+))] |
77 | 81 | (if-let [matcher# (~type (mw/get-coercion-matcher-provider ~+compojure-api-request+))] |
78 | | - (let [result# (schema/coerce ~schema value# matcher#)] |
79 | | - (if (schema/error? result#) |
| 82 | + (let [coerce# (memoized-coercer ~schema matcher#) |
| 83 | + result# (coerce# value#)] |
| 84 | + (if (su/error? result#) |
80 | 85 | (throw+ (assoc result# :type ::ex/request-validation)) |
81 | 86 | result#)) |
82 | 87 | value#))) |
|
0 commit comments