babashka/feature-spec-alpha/babashka/impl/spec.clj

61 lines
2 KiB
Clojure

(ns babashka.impl.spec
{:no-doc true}
(:require [babashka.impl.clojure.spec.alpha :as s]
[babashka.impl.clojure.spec.gen.alpha :as gen]
[babashka.impl.clojure.spec.test.alpha :as test]
[clojure.core :as c]
[sci.core :as sci :refer [copy-var]]
[sci.impl.vars :as vars]))
(def sns (vars/->SciNamespace 'clojure.spec.alpha nil))
(def tns (vars/->SciNamespace 'clojure.spec.test.alpha nil))
(def gns (vars/->SciNamespace 'clojure.spec.gen.alpha nil))
(defn- ns-qualify
"Qualify symbol s by resolving it or using the current *ns*."
[s]
(if-let [ns-sym (some-> s namespace symbol)]
(c/or (some-> (get (ns-aliases *ns*) ns-sym) str (symbol (name s)))
s)
(symbol (str (.name *ns*)) (str s))))
(c/defn def
"Given a namespace-qualified keyword or resolvable symbol k, and a
spec, spec-name, predicate or regex-op makes an entry in the
registry mapping k to the spec. Use nil to remove an entry in
the registry for k."
[_ _ k spec-form]
(let [k (if (symbol? k) (ns-qualify k) k)]
`(clojure.spec.alpha/def-impl '~k '~(s/res spec-form) ~spec-form)))
;; TODO: fix error in clj-kondo: def is a special form which should always be resolved as the special form
#_:clj-kondo/ignore
(def spec-namespace
{'def (sci/copy-var s/def sns)
'def-impl (copy-var s/def-impl sns)
'valid? (copy-var s/valid? sns)
'gen (copy-var s/gen sns)
'cat (copy-var s/cat sns)
'cat-impl (copy-var s/cat-impl sns)
'fdef (copy-var s/fdef sns)
'fspec (copy-var s/fspec sns)
'fspec-impl (copy-var s/fspec-impl sns)
;; 372
'spec (copy-var s/spec sns)
'spec-impl (copy-var s/spec-impl sns)
#_#_'explain-data (copy-var s/explain-data sns)})
#_:clj-kondo/ignore
(def test-namespace
{'instrument (copy-var test/instrument tns)
'unstrument (copy-var test/unstrument tns)})
#_:clj-kondo/ignore
(def gen-namespace
{'generate (copy-var gen/generate gns)})
;; def-impl
;; -> spec? ;; OK
;; regex?
;; spec-impl
;; with-name