Me gustaría utilizar la especificación clojure para crear un conjunto de restricciones de tipo que puedan tener alias o restringirse aún más mediante otras especificaciones.
Por ejemplo, es posible que tenga muchos campos que deban ser válidos para una rebaja saneada.
El siguiente ejemplo funciona para la validación (s/valid?) pero no para la generación (gen/generate)
(s/def ::sanitized-markdown string?)
(s/def ::instruction-list #(s/valid? ::sanitized-markdown %)) ;; works
(gen/generate (s/gen ::instruction-list)) ;; fails
Sin embargo (gen/generate (s/gen ::sanitized-markdown)) funciona.
¿Hay alguna manera de extender ::instruction-list desde ::sanitized-markdown para que conserve todo el comportamiento?
1
(s/def ::lista-de-instrucciones ::rebaja-desinfectada)?
- Lee
26/03/2021 a las 20:43
facepalm Pensé que lo había probado. Debí haberme topado con un error diferente y haber combinado los dos problemas. Con gusto lo marcaré como respuesta si quieres reclamarla
- farlee2121
27 de marzo de 2021 a las 0:08
@Lee, ¿te gustaría reclamar la respuesta?
- farlee2121
28 de marzo de 2021 a las 10:57
------------------------------------
Puedes asignar un alias a otra especificación proporcionándola directamente a s/def:
(s/def ::instruction-list ::sanitized-markdown)
------------------------------------
Puedes usar s/merge al fusionar especificaciones de mapas y s/and en otros casos.
(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"
Un ejemplo con mapas
(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"}