Skip to content

Instantly share code, notes, and snippets.

@shafeeq
Created April 5, 2017 10:04
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 shafeeq/c2ded8e71579a26e44c2191536e01c0d to your computer and use it in GitHub Desktop.
Save shafeeq/c2ded8e71579a26e44c2191536e01c0d to your computer and use it in GitHub Desktop.
Spec Serialization
(require '[clojure.spec :as sp])
(defn dependencies [spec]
(let [deps (atom [])]
(clojure.walk/prewalk
(fn [x]
(if ((sp/registry) x)
(do (swap! deps conj x)
(sp/form x))
x))
(sp/form spec))
(reverse @deps)))
(defn spec-def-exps [spec]
(->> (for [sdef (conj (vec (dependencies spec)) spec)
:when (= (namespace sdef) (namespace spec))]
{sdef (sp/form sdef)})
(into [])))
(comment
"Usage"
(sp/def ::age number?)
(sp/def ::first-name string?)
(sp/def ::last-name string?)
(sp/def ::name (sp/keys :req-un [::first-name ::last-name]))
(sp/def ::user (sp/keys :req-un [::name ::age]))
(spec-def-exps ::user)
[#:my.namespace{:age clojure.core/number?}
#:my.namespace{:last-name clojure.core/string?}
#:my.namespace{:first-name clojure.core/string?}
#:my.namespace{:name
(clojure.spec/keys
:req-un
[:my.namespace/first-name
:my.namespace/last-name])}
#:my.namespace{:user
(clojure.spec/keys
:req-un
[:my.namespace/name
:my.namespace/age])}])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment