Skip to content

Commit

Permalink
correct validity of coerced value and more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wandersoncferreira committed Apr 4, 2020
1 parent 49904b4 commit 4f452db
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
17 changes: 11 additions & 6 deletions src/spec_tools/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -274,16 +274,21 @@
(accept spec value (assoc options :skip? true))
value))

(defmethod walk :or [{:keys [::parse/items] :as spec} value accept options]
(defn- valid-spec [item transformed]
(let [spec (:spec item)]
(cond
(qualified-keyword? spec) (s/valid? (s/get-spec spec) transformed)
(fn? spec) (spec transformed)
:else nil)))

(defmethod walk :or [{:keys [::parse/items]} value accept options]
(reduce
(fn [v item]
(let [transformed (accept item v options)
valid-branch? (s/valid? (create-spec item) transformed)
any-spec? (= (:form spec) #?(:clj 'clojure.core/any?
:cljs 'cljs.core/any?))]
valid? (valid-spec item transformed)]
(cond
(and valid-branch? (not any-spec?)) (reduced transformed)
(= transformed v) v
valid? (reduced transformed)
(not valid?) transformed
:else (reduced transformed))))
value items))

Expand Down
11 changes: 10 additions & 1 deletion test/cljc/spec_tools/core_test.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -804,11 +804,18 @@
(s/def ::tires (s/coll-of (s/and int?) :into #{}))
(s/def ::vehicle (s/or :car ::car
:bike ::bike))

(s/def ::new-vehicle (s/map-of
keyword?
(s/or :vehicle ::vehicle
:tires (s/coll-of (s/and int?) :into #{}))))

(s/def ::keyword keyword?)
(s/def ::int int?)
(s/def ::date inst?)
(s/def ::s (s/or :x (s/keys :req-un [::keyword ::int])
:y (s/keys :req-un [::keyword ::date])))

(deftest issue-179
(testing "st/coerce can work properly with s/or specs"
(let [chevy {:doors 4}]
Expand All @@ -817,4 +824,6 @@
(is (= (st/coerce ::vehicle chevy st/strip-extra-keys-transformer)
{:doors 4}))
(is (= (st/coerce ::new-vehicle {:rodas [1 "1" 3]} st/strip-extra-keys-transformer)
{:rodas #{1 "1" 3}})))))
{:rodas #{1 "1" 3}}))
(is (= (st/coerce ::s {:keyword "a" :date "2020-02-22"} st/json-transformer)
{:keyword :a :date #inst "2020-02-22T00:00:00.000-00:00"})))))

0 comments on commit 4f452db

Please sign in to comment.