Разобрался я с валидацией. Все-таки спека это про форму данных, а не валидацию. И валидация может зависеть от разных внешних факторов. У меня вопрос поинтереснее:
{:publication/id 1
:publication/translations {:en {:publication.translation/title "article"
:article.translation/content "some content"}}
:article/image-url "http://..."}
Т.е. я хочу расширить вложенную мапу, но не могу этого сделать, т.к.
не могу переопределить :publication/translation и добавить туда :article.translation/content
.
Вариант решения я вижу только один - req-un
.
Может еще что-то есть?@kuzmin_m Это нельзя по определению. Если ты ссылаешься на :publication/translations
, то она может быть только одного вида.
так я ее расширяю
Либо в :publication/translations
сделать дополнительный ключ опциональный, и где-то его требовать.
Так ты расширяешь свою спеку для внешнего типа, а не для внутреннего.
по факту article наследует от publication т.е. он может усиливать контракт, что я и хочу если бы я ослаблял контракт, выкидывая ключи, это да
Тогда просто сделай дополнительную проверку наверху.
генератор отвалится 😃
¯\(ツ)/¯
для датомика с его фактами спека идеально подходит а если нужны вложенные мапы - боль и страдания
Спека плохо подходит для случая "а теперь мы напихаем всякую хрень в типы, на которые мы ссылаемся"
можешь пояснить?
Ну вот есть тип :publication/translations
. Ты его определил, у него ключи, всё такое.
А теперь оказывается, что тип-то не тот! В каком-то контексте там ещё другой тип.
так я его расширяю
Не его.
Спека нерекурсивная.
Можно расширить внутренний тип, а потом сослаться на расширенный в том месте, где надо.
что значит “внутренний тип“?
Но тогда нужно другой ключ, так как это другой тип.
Тип мапы с ключом :publication/translations
.
Спека говорит "если ты употребил такой-то ключ, то этим ты сказал, что значение этого ключа имеет такой-то тип".
И не подходит в случае, когда у одного и того же ключа разные типы.
и приведения “типов” тут нет
было бы забавно, если для доступа по ключу учитывалось наследование
(derive :b :a)
(:b {:a 1}) ;;=> 1
тогда можно было бы и спеки наследовать
но это на первый взгляд наркоманиявроде как дали “типы“, но они не работают как типы
А это не типы, такие дела.
Это формы.
что такое “формы“?
Data shapes. Спека подразумевает очень своеобразный подход к моделированию данных.
Если ты что-то назвал, то у этого чего-то конкретная форма.
Нельзя в двух разных местах использовать две разные формы под одним именем.
ок, спасибо
Я уже на это натыкался, когда хотел спекой покрыть чужую модель данных (там это вообще JSON).
Там в зависимости от места в дереве один и тот же ключ означал разные вещи.
Взял вместо этого схему.
Как раз вместе со schema-refined
, на которую тут ссылка пробегала.
Понял я свою ошибку. Нельзя так делать, как я хочу. Если у публикации есть публикация.перевод, и статья наследует публикации, то в интерфейсе статьи обязан быть публикация.перевод, а не статья.перевод.
Нет, можно так делать: https://repl.it/@darkleaf/inheritance
https://hardcode.fm/2018/12/29/episode007.html теперь с @nicola Этот выпуск специально для этого чатика - про Рича, conj и maybe not (лучше поздно, чем никогда) Особенно тем, кто не в телеге 🙂