Skip to content

Instantly share code, notes, and snippets.

@loliveira
Last active November 18, 2021 06:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save loliveira/e1806bb34c06a57c3ad8370dd38b767f to your computer and use it in GitHub Desktop.
Save loliveira/e1806bb34c06a57c3ad8370dd38b767f to your computer and use it in GitHub Desktop.
Em um mapa, se tenho presente um campo ::a, quero tornar obrigatório o campo ::b e ::c também obrigatórios?
(defn multi-answer [answer]
(cond
(or (contains? answer :answer/lat)
(contains? answer :answer/lon)) :answer.type/text-with-location
:else :answer.type/text))
(defmulti data-type multi-answer)
(s/def :answer/text (and string? #(<= (count %) 4096)))
(defmethod data-type :answer.type/text [_]
(s/keys :req [:answer/text]))
(s/def :answer/lat double?)
(s/def :answer/lon double?)
(defmethod data-type :answer.type/text-with-location [_]
(s/keys :req [:answer/text
:answer/lat
:answer/lon]))
(s/def :answer/data
(s/multi-spec data-type multi-answer))
(s/explain-data :answer/data {:answer/text "42"})
(s/explain-data :answer/data {:answer/lat 0.0})
(s/explain-data :answer/data {:answer/lon 0.0})
(s/explain-data :answer/data {:answer/lat 0.0
:answer/lon 0.0})
(s/explain-data :answer/data {:answer/text "42"
:answer/lat 0.0})
(s/explain-data :answer/data {:answer/text "42"
:answer/lat 0.0
:answer/lon 0.0})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment