Is there a way to instruct clojure.core.edn/read
how to resolve auto namespaced keywords ?
(edn/read-string "{:not-namespaced \"ko\" }") ;;=> {:not-namespaced "ko"}
(edn/read-string "{:namespaced/ok \"ko\" }") ;;=> #:namespaced{:ok "ko"}
(edn/read-string "{::namespaced \"ko\" }") ;;=> Unhandled java.lang.RuntimeException Invalid token: ::namespaced autonamespaced does not work
The last exception makes sense, since "A keyword cannot begin with ::".
I could use load-file
with this simple example, however I also need the extensibility of edn
(read custom tags).
Having a parameter to instruct how to resolve namespaces would make my config files (coerced with clojure.spec
) much more readable.
So in my case it turn out the simplest solution is to use clojure.spec with un-namespaced keywords in my config file (I did not know it could do that).
Using the core readers functions would have worked too.
Quote from Alex Miller on slack:
Yes, you'll need full namespaces in edn config files You could also write specs on unqualified keys with req-un and opt-un
Either the normal core reader fns or clojure.edn reader fns should be able to read tagged literals though with # You just need to bind around the call to set up the readers