Skip to content

Instantly share code, notes, and snippets.

@Deraen
Created June 14, 2016 15:47
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Deraen/6c686358da62e8ed4b3d19c82f3e786a to your computer and use it in GitHub Desktop.
Save Deraen/6c686358da62e8ed4b3d19c82f3e786a to your computer and use it in GitHub Desktop.
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
@venantius
Copy link

Thanks for putting this up; I found the actual documentation on the use of conformers sort of impossible to parse.

@gdeer81
Copy link

gdeer81 commented Jan 4, 2017

I fixed your try/catch block if you want to pull in my changes
https://gist.github.com/gdeer81/0c2406cf58cde5785794b1153b65b1f2

I have this thing about example code being repl ready. =)

@wilkerlucio
Copy link

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

@codeasone
Copy link

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