metosin / compojure-api

Sweet web apis with Compojure & Swagger
http://metosin.github.io/compojure-api/doc/
Eclipse Public License 1.0
1.12k stars 149 forks source link

explain-data should pass coerced value #409

Closed mping closed 5 years ago

mping commented 5 years ago

Library Version(s)

2.0.0-alpha28

Problem

When a request fails spec validation, explain-data should use the coerced value for problems identification:

;;in compojure.api.coercion.spec
(coerce-request [_ spec value type format _]
    (let [spec (maybe-memoized-specify spec)
          type-options (options type)]
      (if-let [transformer (or (get (get type-options :formats) format)
                               (get type-options :default))]
        (let [coerced (st/coerce spec value transformer)]
          (if (s/valid? spec coerced)
            coerced
            ;; st/conform should be called with "coerced" instead of "value"?
            (let [conformed (st/conform spec value transformer)]
              (if (s/invalid? conformed)
                ;; st/explain-data should be called with "coerced" instead of "value"?
                (let [problems (st/explain-data spec value transformer)]
                  (cc/map->CoercionError
                    {:spec spec
                     :problems problems}))
                (s/unform spec conformed)))))
        value)))

schema coercion apparently uses the coerced value:

;; in compojure.api.coercion.schema
(let [coerce (memoized-coercer schema matcher)
              coerced (coerce value)]
          (if (su/error? coerced)
            (let [errors (su/error-val coerced)] ;;error-val is called on top of coerced val
              (cc/map->CoercionError
                {:schema schema
                 :errors errors}))
            coerced))

I'm happy to submit a PR if required.

ikitommi commented 5 years ago

PR most welcome!

mping commented 5 years ago

PR submitted.