マップエントリのベクトルを検証するために clojure.spec を使用しています。ベクトルは次のようになります。
[{:point {:x 30 :y 30}}
{:point {:x 34 :y 33}}
{:user "joe"}]
1..N 個の::point
エントリと単一のエントリのみを要求するように仕様を構成したいと思います::user
。
これが、この仕様を構築するための私の (失敗した) 試みです。
(s/def ::coord (s/and number? #(>= % 0)))
(s/def ::x ::coord)
(s/def ::y ::coord)
(s/def ::point (s/keys :req-un [::x ::y]))
(s/def ::user (s/and string? seq))
(s/def ::vector-entry (s/or ::pt ::user))
(s/def ::my-vector (s/coll-of ::vector-entry :kind vector))
::point
1 つのエントリの検証だけを実行すると、次のように動作します。
spec> (s/valid? ::point {:point {:x 0 :y 0}})
true
spec> (s/valid? ::my-vector [{:point {:x 0 :y 0}}])
false
s/or
ベクトル エントリが::user
または::point
タイプのいずれかになるようにパーツを構造化する方法についてのアイデアはありますか?
また、ベクトルに 1 つだけの::user
エントリと 1..N::point
エントリを要求する方法についてのアイデアはありますか?