@dottedmag а что ты потом с этой внешней мапой делаешь? трансформируешь в кложурную внутреннюю? если да, то сразу трансформируй (set/rename-keys или че там), и потом по внутренней православной спеке проверяй. проверять спекой не так дешево, что ты прям сэкономил бы трансформацию, если бы внешней спекой чекнул сначала
еще вариант walk/keywordize-keys
сначала, а потом у же (s/keys :req-un ...)
, потом трансформация, потом (s/keys :req ...)
Может это тоже подойдёт? https://github.com/funcool/struct
@kirill.salykin Спасибо за ссылку. Я только на днях думал начать пилить нечто подобное.
есть еще spec-tools - https://github.com/metosin/spec-tools
@kirill.salykin Спасибо.
"Since struct is a young project there may be some API breakage." [funcool/struct "1.3.0"]
эээ?
Каждый раз будут мажорную версию менять?
@misha Мне надо оба слоя валидировать: первый на границе системы, чтобы не принимать лажу, второй внутри, чтобы проверять инварианты.
Непринятие лажи по жёстким критериям важно, так как система чем-то похожа на блокчейн: несколько узлов принимают ченджсеты и строят из них идентичное состояние.
Узлы на разных языках, так как это клиенты для разных платформ.
@dottedmag а схема-то подошла?
@dottedmag пример спеки-то подошел? :kappa:
ИМХО, после спеки - схему уже как-то не хочется, но для некоторых случаев это пока самый адекватрый вариант. Мы сейчас пытаемся жить и с тем и с другим ввиду специфичности стека. В итоге как устроено у нас: Все query в нашу api мы проверяем схемой, там все просто, схемы хватает за глаза и она работает из коробки в нашем веб-сервере. А вот все, что приходит в body (post put) уже более интересные вещи, там могут быть довольно сложные валидаторы, которые в схеме фиг опишешь без костылей и тут приходит на помощь спека. Так вот, для таких запросов у нас цепочка интерцепторов в которыой слачала корексятся body, а потом накладывается спека для валидации. Коерсить можно хоть spec-tools хоть spec-coerce, это уже на любителя. Втрая либа сильно проще и занимается исключительно коекцией.
@akond Когда совершу следующий подход к снаряду - попробую и схему, и struct.
@misha Это был модельный пример для того, чтобы выявить неадекватность спеки для задачи.
Вариант с :external/*
интересный, но в нём всё равно нужно ручками коэрсию делать дальше.
ну спека - про валидацию, а не трансформацию/коэрсию
Спасибо, кэп!
> И есть ли, чем валидировать внешние данные и приводить их в приличный вид?
Самое простое! Легко дописывается чего не хватает. https://github.com/wilkerlucio/spec-coerce