我非常确定我需要一个多规格,它的工作原理。但我不确定如何说一个向量的关键值可以包含异构地图。如何编写一个规格,其中一个地图有一个密钥基于另一个密钥具有异构内容
我的是我的源数据我想规格:
(def int-attr { :type "int" :validations [{ :min 0 } { :max 100 }] })
(def string-attr { :type "string" :validations [{ :presence true }] })
这是我有问题,这取决于type
键validations
键,"int"
或"string"
,我想在validations
不同规格键。
我很确定我必须使用multi-spec
。这是我曾尝试:
(defmulti attribute-type :type)
(defmethod attribute-type "string" [a] ::string-validations)
(defmethod attribute-type "int" [a] ::int-validations)
;; how to say this is a vector of int-min-validation, or int-max-validation etc.
;; (s/+ ...) and (s/or ...) maybe?
(s/def ::int-validations (...)
(s/def ::string-validations (...)
;; not sure how to incorporate these...
(s/def ::int-min-validation (s/keys :req-un [::min]))
(s/def ::int-max-validation (s/keys :req-un [::max]))
(s/def ::string-presence-validation (s/keys :req-un [::presence]))
(s/def ::attribute (s/multi-spec attribute-type ::type))
(s/explain ::attribute int-attr)
(s/explain ::attribute string-attr)
你所拥有的规格有点奇怪,如果你可以给出一个你想要规范的实际数据的例子,它会让你的意图更清晰和更容易帮助。 – Josh
实际数据位于顶部,“int-attr”和“string-attr”。 – Kris
好吧,我明白了 - 我似乎想要使用spec进行验证,事实上,它是用于*进一步验证的属性。也许'int-attr'和'string-attr'会在你的系统的其他部分使用,这种验证类型是有意义的,但在这里看起来很奇怪。例如,如果你想验证0到100之间的整数,使用spec,你只需要使用内置的'(s/int-in 0 101)'。 “存在”有点奇怪,甚至使用“验证”这个词似乎也表明“规范”与“验证”是等同的,这并不准确。 – Josh