Ключ :db/id
в родительской карте должен быть здесь строкой (как в temp-id для datomi c), но :db/id
в карте внутри :service/user
должен быть существующим идентификатором пользователя, поэтому должно быть числом.
Кажется, спецификации родительского объекта переопределяют спецификации ключа вложенной карты :db/id
. Это ожидается или я что-то здесь упускаю? Как я могу избежать этого?
(require '[clojure.spec.alpha :as s])
(require '[spec-tools.data-spec :as stds])
(let [service-specs (stds/spec
{:spec {:db/id string?
:service/user {:db/id number?}}})]
(s/explain service-specs {:db/id "temp-id" ;;temp-id for datomic here
:service/user {:db/id 12345}})) ;; this one should be a number
;;==>
-- Spec failed --------------------
{:db/id ..., :service/user {:db/id 12345}}
^^^^^
should satisfy
string?
-- Relevant specs -------
:db/id:
(spec-tools.core/spec
{:spec clojure.core/string?,
:type :string,
:leaf? true,
:spec-tools.core/synthetic? true})
:service/user:
(spec-tools.core/spec
{:spec (clojure.spec.alpha/keys :req [:db/id]),
:name :service/user,
:spec-tools.core/synthetic? true,
:type :map,
:leaf? false})
-------------------------
Detected 1 error