少し前に単純なポリモーフィック スキーマについて尋ねたところ、しばらくの間はうまくいきました。
検証したいマップには、別のキーの値に依存する追加の値があります。
オブジェクトの不自然な例:
{:type :foo {:type :bert {:type :foo
:foo-param :bar :bert-size :medium :foo-param :bar
:method :baz :method :baz :method :bang
:baz-rate :max} :baz-rate :max} :bangness :considerable}
ここでの識別子は:type
と:method
で、それぞれに有効な兄弟キーと値の独自のセットがあります。
以前は:type
存在するだけで、次のものが機能しました。
(def ^:private test-base-schema {:type (s/enum :foo :abc :banana)})
(def test-schema
(s/conditional #(= (:type %) :foo)
(merge test-base-schema {:foo-param s/Keyword})
; other conditions here
))
ただし、複数の弁別子があるため、条件分岐の数は組み合わせになります。
1 つのオプションは{s/Any s/Any}
、マップと使用をs/both
許可することですが、予期しないキー/値が無効と見なされるため、スキーマが「緩い」ことを許可できません。
また、このライブラリを使用して検証を機能させるためだけに、検証中のマップの構造を変更したくありません。
複数の条件付きサブスキーマを持つマップの厳密な検証を実現する適切な方法はありますか?