Clojure.Spec является производным или псевдонимом другой спецификации

Я хотел бы использовать спецификацию clojure для создания набора ограничений типа, которые могут быть сглажены или дополнительно ограничены другими спецификациями.

Например, у меня может быть много полей, все из которых должны быть действительными с санитарной уценкой.

Следующий пример работает для проверки (s/valid?), но не для генерации (gen/generate)

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list #(s/valid? ::sanitized-markdown %)) ;; works

(gen/generate (s/gen ::instruction-list)) ;; fails

Однако (gen/generate (s/gen ::sanitized-markdown)) работает.

Есть ли способ расширить ::instruction-list из ::sanitized-markdown, чтобы сохранить все поведение?


person farlee2121    schedule 26.03.2021    source источник
comment
facepalm Я думал, что пробовал это. Должно быть, я столкнулся с другой ошибкой и объединил две проблемы. Я с радостью отмечу это как ответ, если вы хотите это заявить   -  person farlee2121    schedule 27.03.2021
comment
@Lee Ли, хочешь получить ответ?   -  person farlee2121    schedule 28.03.2021


Ответы (2)


Вы можете создать псевдоним для другой спецификации, предоставив ее непосредственно s/def:

(s/def ::instruction-list ::sanitized-markdown)
person Lee    schedule 28.03.2021

Вы можете использовать s/merge при объединении спецификаций карты и s/and в других случаях.

(s/def ::sanitized-markdown string?)
(s/def ::instruction-list (s/and ::sanitized-markdown #(> (count %) 10)))

(s/valid? ::instruction-list "abcd")
;; false
(s/valid? ::instruction-list "abcdefghijkl")
;; true

(gen/generate (s/gen ::instruction-list)) 
;; "178wzJW3W3zx2G0GJ1931eEeO"

Пример с картами

(s/def ::a string?)
(s/def ::b string?)
(s/def ::c string?)
(s/def ::d string?)
(s/def ::first-map (s/keys :opt [::a ::b]))
(s/def ::second-map (s/keys :opt [::c ::d]))
(s/def ::third-map (s/merge ::first-map ::second-map))

(s/valid? ::third-map {:a "1" :d "2"})
;; true
(gen/generate (s/gen ::third-map))
;; {::b "gvQ7DI1kQ9DxG7C4poeWhk553", ::d "9KIp77974TEqs9HCq", ::c "qeSZA8NcYr7UVpJDsA17K"}
person Stanislas Nanchen    schedule 27.03.2021