Clojure.spec coercion test
(ns spec-test.core | |
(:require [clojure.spec :as s])) | |
(defn x-integer? [x] | |
(if (integer? x) | |
x | |
(if (string? x) | |
(try | |
(integer/parseint x) | |
(catch exception e | |
:clojure.spec/invalid)) | |
:clojure.spec/invalid))) | |
(s/def ::user/name string?) | |
(s/def ::user/age (s/conformer x-integer?)) | |
(s/def ::user (s/keys :req [::user/name ::user/age])) | |
(s/conform ::user {::user/name "juho" ::user/age 9001}) | |
;; => {:user/name "juho", :user/age 9001} | |
(s/conform ::user {::user/name "juho" ::user/age "9001"}) | |
;; => {:user/name "juho", :user/age 9001} | |
(s/conform ::user {::user/name "juho" ::user/age "x9001"}) | |
;; => :clojure.spec/invalid |
This comment has been minimized.
This comment has been minimized.
I fixed your try/catch block if you want to pull in my changes I have this thing about example code being repl ready. =) |
This comment has been minimized.
This comment has been minimized.
Also, check the Spec Coerce project, it does spec inference to coerce your data and supports a custom coerce dictionary: https://github.com/wilkerlucio/spec-coerce |
This comment has been minimized.
This comment has been minimized.
This is a helpful compared to the first example listed in https://clojuredocs.org/clojure.spec/conformer which is too cryptic for the uninitiated in my opinion. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Thanks for putting this up; I found the actual documentation on the use of conformers sort of impossible to parse.