clojure规格依赖性字段



我有一个记录,对于此规范,我想生成值,但要确保当前金额不超过最大金额。简化的规格将是:

(s/def ::max-amt (s/and number? #(<= 0 % 1e30)))
(s/def ::cur-amt (s/and number? #(<= 0 % 1e30)))
(s/def ::loan (s/cat :max-amt ::max-amt
                     :cur-amt ::cur-amt))

我知道我可以在::loan规格中使用s/and,但我想要类似的东西:

(s/def :loan (s/cat :max-amt ::max-amt
                    ;; not a real line:
                    :cur-amt (s/and ::cur-amt #(< (:cur-amt %) (:max-amt %)))))

这种类型的约束是否可用?

注意:我知道我可以用代表分数部分的0到1之间的数字替换cur-amt。我在此处的实际应用程序中不控制数据源。

这应该有效(根据此讨论进行了改编):

(s/def ::loan (s/and (s/keys :req [::cur-amt ::max-amt])
                     (fn [{:keys [::cur-amt ::max-amt]}]
                       (< cur-amt max-amt))))
(s/conform ::loan {:cur-amt 50 :max-amt 100}) ; => {:cur-amt 50 :max-amt 100}
(s/conform ::loan {:cur-amt 100 :max-amt 50}) ; => :clojure.spec/invalid

或,如果要坚持s/cat

(s/def ::loan (s/and (s/cat :cur-amt ::cur-amt
                            :max-amt ::max-amt)
                     (fn [{:keys [cur-amt max-amt]}]
                       (< cur-amt max-amt))))
(s/conform ::loan [50 100]) ; => [50 100]
(s/conform ::loan [100 50]) ; => :clojure.spec/invalid

最新更新