Clojure edn для чтения ключевых слов с автоматическими именами
Есть ли способ проинструктировать clojure.core.edn/read
как разрешить авто ключевые слова пространства имен?
(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
Последнее исключение имеет смысл, так как "Ключевое слово не может начинаться с::".
Я мог бы использовать load-file
с этим простым примером, однако мне также нужна расширяемость edn
(читать пользовательские теги).
Наличие параметра, указывающего, как разрешать пространства имен, сделает мои файлы конфигурации (принудительно clojure.spec
) гораздо удобочитаемее.
1 ответ
Так что в моем случае самое простое решение - использовать clojure.spec с ключевыми словами без пространства имен в моем конфигурационном файле (я не знал, что это можно сделать).
Использование основных функций считывателей тоже сработало бы.
Цитата от Алекса Миллера на расслабленной:
Да, вам понадобятся полные пространства имен в конфигурационных файлах edn. Вы также можете написать спецификации для неквалифицированных ключей с помощью req-un и opt-un
Либо обычный читатель ядра fns, либо читатель clojure.edn fns должен иметь возможность читать помеченные литералы, хотя с # Вам нужно просто связать вызов для настройки считывателей
Мне нравится преобразовывать строку перед ее анализом, чтобы файлы edn оставались чистыми, не считая ключи спецификации неквалифицированными.
(-> "{::namespaced \"ko\" }"
(#(string/replace % #"::" ":some.namespace/"))
(edn/read-string))
Это может быть не очень надежным при записи и повторном чтении файлов edn, но хорошо работает с данными конфигурации.