У меня есть определение спецификации, которое проверяет содержимое входящих данных. Поскольку данные представляют собой карту полей, я использую spec/keys
для ее проверки. Например:
(def person-data {:name "Jon Doe", :age 30})
(s/def ::name string?)
(s/def ::age pos-int?)
(s/def ::person-info (s/keys :req-un [::name ::age])
...
;validate data via spec and make sure no additional keys are included
(s/valid? ::person-spec some-input)
Но у меня есть дополнительная потребность убедиться, что входящие данные содержат только те ключи, которые мне нужны. (в данном случае только клавиши :name
и :age
. Для этого я делаю что-то вроде:
(def permitted-keys [:age :name])
(select-keys some-input permitted-keys)
, гарантируя, что будут отфильтрованы только эти ключи.
Есть ли способ повторно использовать некоторый код между моим определением спецификации для структуры карты (s/keys
) и этим дополнительным шагом, который я предпринимаю для фильтрации разрешенных ключей (permitted-keys
)?
Возможно, либо извлекая список ключей из определения s/keys
, либо передавая существующий вектор ключей в s/keys
?