Clojure spe c -tools.data-spe c переопределяет спецификации для идентичных ключей во вложенных картах - PullRequest
0 голосов
/ 18 апреля 2020

Ключ :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
...