Size: a a a

Clojure — русскоговорящее сообщество

2020 December 15

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Anatoliy Guliy
Подскажите, как вы решаете вопросы валидации развесистых  map? Но не в плане валдации структуры, с этим более или менее ясно, а когда надо проверить некие бизнес-правила на данных. То-есть, у нас есть некий объект и набор правил валидации (порой довольно сложных с кроссзависимостями полей на разных уровнях вложенности). А дальше надо применить все эти правила к нашему объекту и сообщить где и что не так. В мире xml такие задачи неплохо решает схематрон. Но не очень хочется тянуть все эту xml муть… Есть идее чем это можно покрыть?
просто спекой через s/and и кастомными предикатами. Предикат это функция, которая принимает мапу и проверяет, что все на месте.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
ну то есть

(s/def ::uber-object
 (s/and
    (s/keys ...)
    (fn [{:keys [field1 field2]
         (= field1 field2)}])
   (fn [...])))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
едиснтвенная проблема это нормальное сообщение об ошибке, но в этом случае предикаты регаешь под своими спеками, и потом по словарю переводов ищешь сообщение
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(s/def ::custom-check (fn [...]...))

(s/def ::uber-object (s/and (s/keys ...) ::custom-check))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
если упал кастомный предикат, в словаре проблем получишь ::custom-check, и для него сообщение по словарю
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
{::custom-check "все пропало"}
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
а как решать пробелему, когда у тебя правило, например такое: если хоть у како-го-то ребенка  (= field-a 133)- то у всех родитеелй должно быть (= field-c  555)  ? Рекурсивно наверх до самого рута
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Anatoliy Guliy
а как решать пробелему, когда у тебя правило, например такое: если хоть у како-го-то ребенка  (= field-a 133)- то у всех родитеелй должно быть (= field-c  555)  ? Рекурсивно наверх до самого рута
Писать предикаты обычные функциями
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
просто написать предикат с обходом. Его же потом будет удобно протестить в репле или написать тест на это
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
Azamat Kalimoulline
В принципе, можно самому написать, там несложно. Рекурсивно. Но можно и зен посмотреть.
И писать самом не очень хочется, точнее это трудно потому как очень много таких случаем и хочтеся дать просто какое решение для пользователей, когда они могут сами эти правила писать в каком-то формально виде, ну вот прям как вс схематроне…
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
никто еще xpath для edn не придумал?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Он уже есть в виде get-in, например [:user :profile :name]
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
не совсем… надо что-то типа [:root * :user :profile :name] - где * все что угодно… некакя рекурсия
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Anatoliy Guliy
не совсем… надо что-то типа [:root * :user :profile :name] - где * все что угодно… некакя рекурсия
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
так вроде cpecter умеет, да
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
да, что-то умеет, но какой-то он не очень очевидный (я пару раз смотрел и как-то не пересили себя разобраться…) надо еще раз глять )
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Anatoliy Guliy
Подскажите, как вы решаете вопросы валидации развесистых  map? Но не в плане валдации структуры, с этим более или менее ясно, а когда надо проверить некие бизнес-правила на данных. То-есть, у нас есть некий объект и набор правил валидации (порой довольно сложных с кроссзависимостями полей на разных уровнях вложенности). А дальше надо применить все эти правила к нашему объекту и сообщить где и что не так. В мире xml такие задачи неплохо решает схематрон. Но не очень хочется тянуть все эту xml муть… Есть идее чем это можно покрыть?
У меня есть исследовательский проект. И в нем я использую datascript для развесистой модели.
Плюсы в том, что там есть индексы, и не нужно их руками строить. Индексы - это когда мы вот так делаем { :posts { 1 {:id 1, :title "some title"} } }.
https://github.com/darkleaf/publicator/blob/3.1/src/publicator/core/domain/aggregates/publication.cljc
там прямо нет зависимых валидаций, но их можно легко сделать
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
у меня есть датомик вместо датаскрипта )
источник

AG

Anatoliy Guliy in Clojure — русскоговорящее сообщество
да и понятно, что руками можно все это написать, но очень желательно что бы это все можно было декларативно описывать…
источник

DF

Damir Farazetdinov in Clojure — русскоговорящее сообщество
тоже чё-то я запутался.
Тебе нужны как бы две вещи (ортогональные?):
1. доступ к данным как в xPath
2. валидация с кроссзависимостями, уровнями вложенности и рекурсиями
а ещё:
3. простой язык, чтобы юзеры могли сами прогать

1. юзай датомик там, где нужно xPath. То, что Бог прописал.
2. валидация с непростыми правилами - это да. наверное отдельная тема.
у меня щас примерно такое в голове в фоне варится.
уже почти готово (вилкой прокалывается)
источник