polish Coercion protocol

* compile => compile-model
* mae-open => open-model
This commit is contained in:
Tommi Reiman 2017-12-03 17:29:06 +02:00
parent a436b32729
commit b210a98f83
4 changed files with 17 additions and 23 deletions

View file

@ -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"))

View file

@ -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

View file

@ -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)]

View file

@ -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)))