mirror of
https://github.com/metosin/reitit.git
synced 2025-12-29 12:48:25 +00:00
polish Coercion protocol
* compile => compile-model * mae-open => open-model
This commit is contained in:
parent
a436b32729
commit
b210a98f83
4 changed files with 17 additions and 23 deletions
|
|
@ -1,12 +1,11 @@
|
|||
(ns reitit.ring.coercion.protocol
|
||||
(:refer-clojure :exclude [compile]))
|
||||
(ns reitit.ring.coercion.protocol)
|
||||
|
||||
(defprotocol Coercion
|
||||
"Pluggable coercion protocol"
|
||||
(get-name [this] "Keyword name for the coercion")
|
||||
(compile [this model name] "Compiles a coercion model")
|
||||
(get-apidocs [this model data] "???")
|
||||
(make-open [this model] "Returns a new map model which doesn't fail on extra keys")
|
||||
(compile-model [this model name] "Compiles a model")
|
||||
(open-model [this model] "Returns a new model which allows extra keys in maps")
|
||||
(encode-error [this error] "Converts error in to a serializable format")
|
||||
(request-coercer [this type model] "Returns a `value format => value` request coercion function")
|
||||
(response-coercer [this model] "Returns a `value format => value` response coercion function"))
|
||||
|
|
|
|||
|
|
@ -38,15 +38,14 @@
|
|||
protocol/Coercion
|
||||
(get-name [_] name)
|
||||
|
||||
(compile [_ model _]
|
||||
model)
|
||||
|
||||
(get-apidocs [_ _ {:keys [parameters responses] :as info}]
|
||||
(cond-> (dissoc info :parameters :responses)
|
||||
parameters (assoc ::swagger/parameters parameters)
|
||||
responses (assoc ::swagger/responses responses)))
|
||||
|
||||
(make-open [_ schema] (st/open-schema schema))
|
||||
(compile-model [_ model _] model)
|
||||
|
||||
(open-model [_ schema] (st/open-schema schema))
|
||||
|
||||
(encode-error [_ error]
|
||||
(-> error
|
||||
|
|
|
|||
|
|
@ -46,10 +46,6 @@
|
|||
(into-spec [this _]
|
||||
(st/create-spec {:spec this})))
|
||||
|
||||
;; TODO: proper name!
|
||||
(def memoized-into-spec
|
||||
(memoize #(into-spec %1 (gensym "spec"))))
|
||||
|
||||
(defn stringify-pred [pred]
|
||||
(str (if (seq? pred) (seq pred) pred)))
|
||||
|
||||
|
|
@ -61,33 +57,33 @@
|
|||
protocol/Coercion
|
||||
(get-name [_] name)
|
||||
|
||||
(compile [_ model _]
|
||||
(memoized-into-spec model))
|
||||
|
||||
(get-apidocs [_ _ {:keys [parameters responses] :as info}]
|
||||
(get-apidocs [this _ {:keys [parameters responses] :as info}]
|
||||
(cond-> (dissoc info :parameters :responses)
|
||||
parameters (assoc
|
||||
::swagger/parameters
|
||||
(into
|
||||
(empty parameters)
|
||||
(for [[k v] parameters]
|
||||
[k memoized-into-spec])))
|
||||
[k (protocol/compile-model this v nil)])))
|
||||
responses (assoc
|
||||
::swagger/responses
|
||||
(into
|
||||
(empty responses)
|
||||
(for [[k response] responses]
|
||||
[k (update response :schema memoized-into-spec)])))))
|
||||
[k (update response :schema #(protocol/compile-model this % nil))])))))
|
||||
|
||||
(make-open [_ spec] spec)
|
||||
(compile-model [_ model _]
|
||||
(into-spec model (or name (gensym "spec"))))
|
||||
|
||||
(open-model [_ spec] spec)
|
||||
|
||||
(encode-error [_ error]
|
||||
(-> error
|
||||
(update :spec (comp str s/form))
|
||||
(update :problems (partial mapv #(update % :pred stringify-pred)))))
|
||||
|
||||
(request-coercer [_ type spec]
|
||||
(let [spec (memoized-into-spec spec)
|
||||
(request-coercer [this type spec]
|
||||
(let [spec (protocol/compile-model this spec nil)
|
||||
{:keys [formats default]} (conforming type)]
|
||||
(fn [value format]
|
||||
(if-let [conforming (or (get formats format) default)]
|
||||
|
|
|
|||
|
|
@ -87,9 +87,9 @@
|
|||
(defrecord NoOpCoercion []
|
||||
protocol/Coercion
|
||||
(get-name [_] :no-op)
|
||||
(compile [_ model _] model)
|
||||
(get-apidocs [_ _ {:keys [parameters responses] :as info}])
|
||||
(make-open [_ spec] spec)
|
||||
(compile-model [_ model _] model)
|
||||
(open-model [_ spec] spec)
|
||||
(encode-error [_ error] error)
|
||||
(request-coercer [_ type spec] (fn [value format] value))
|
||||
(response-coercer [this spec] (protocol/request-coercer this :response spec)))
|
||||
|
|
|
|||
Loading…
Reference in a new issue