diff --git a/src/spec_tools/core.cljc b/src/spec_tools/core.cljc index 628599e8..f8b894e7 100644 --- a/src/spec_tools/core.cljc +++ b/src/spec_tools/core.cljc @@ -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)) diff --git a/test/cljc/spec_tools/core_test.cljc b/test/cljc/spec_tools/core_test.cljc index 4f2a251c..e07790a5 100644 --- a/test/cljc/spec_tools/core_test.cljc +++ b/test/cljc/spec_tools/core_test.cljc @@ -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}] @@ -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"})))))