3

マップエントリのベクトルを検証するために 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))

::point1 つのエントリの検証だけを実行すると、次のように動作します。

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エントリを要求する方法についてのアイデアはありますか?

4

3 に答える 3