Я использую re-frame с spec для проверки app-db
, как в todomvc.
Когда пользователь делает недопустимую запись, я использую s/explain-data
(в перехватчике повторного кадра), чтобы вернуть карту problems
с именем :pred
icate, которое вызвало ошибку проверки. Этот предикат является символом, подобным project.db/validation-function
.
Моя функция проверки имеет метаданные, которые доступны из repl, используя:
(meta #'project.db/validation-function)
Определение функции (в пространстве имен project.db
) выглядит так:
(defn validation-function
"docstring..."
{:error-message "error message"}
[param]
(function-body...)
Проблема в том, что я не могу понять, как динамически извлекать метаданные (работая в пространстве имен project.events
), например:
(let [explain-data (s/explain-data spec db)
pred (->> (:cljs.spec.alpha/problems explain-data) first :pred)
msg (what-goes-here? pred)]
msg)
Я пробовал следующие вещи вместо what-goes-here?
:
symbol?
даетtrue
str
дает"project.db/validation-function"
meta
даетnil
var
выдает ошибку времени компиляции «Невозможно разрешить var: p1__46744# в этом контексте»
Я думаю, проблема в том, что я получаю символ, но мне нужна переменная, на которую он ссылается, и именно там живут метаданные.
Я пробовал использовать макрос, но действительно не знаю, что я делаю. Это самое близкое обсуждение, которое я смог найти, но я не смог разобраться.
Помощь!