Fork me on GitHub
#clojure-spec
<
2020-11-23
>
Drew Verlee13:11:29

Is it possible to extract the argument list e.g (s/cat :x int?) from an existing spec?

sgepigon15:11:55

user=> (require '[clojure.spec.alpha :as s])
nil
user=> (s/form (:args (s/fspec :args (s/cat :x int?))))
(clojure.spec.alpha/cat :x clojure.core/int?)
;; or if you use `s/fdef`:
user=> (s/fdef foo :args (s/cat :x int?))
user/foo
user=> (s/form (:args (s/get-spec `foo)))
(clojure.spec.alpha/cat :x clojure.core/int?)
This also works for :ret and :fn as fspecs implement clojure.lang.ILookup.

Drew Verlee13:11:29

(s/arg foo) ;;=> [{:x int?}]

borkdude13:11:41

@drewverlee I'm not entirely clear on what your code should do, but maybe s/form is something that's useful for you?

sgepigon15:11:55

user=> (require '[clojure.spec.alpha :as s])
nil
user=> (s/form (:args (s/fspec :args (s/cat :x int?))))
(clojure.spec.alpha/cat :x clojure.core/int?)
;; or if you use `s/fdef`:
user=> (s/fdef foo :args (s/cat :x int?))
user/foo
user=> (s/form (:args (s/get-spec `foo)))
(clojure.spec.alpha/cat :x clojure.core/int?)
This also works for :ret and :fn as fspecs implement clojure.lang.ILookup.

Drew Verlee20:11:28

thanks @borkdude and @sgepigon that answers the question for me.

👍 3