/src/provisdom/spectomic/specs.clj

https://github.com/Provisdom/spectomic · Clojure · 59 lines · 48 code · 11 blank · 0 comment · 0 complexity · dff99efd181519f8137cc0c3f12c1097 MD5 · raw file

  1. (ns provisdom.spectomic.specs
  2. (:require
  3. [clojure.spec.alpha :as s]
  4. [clojure.spec.gen.alpha :as gen]
  5. [clojure.string :as str]
  6. [clojure.spec.alpha :as s]))
  7. (def datomic-value-types
  8. #{:db.type/string :db.type/boolean :db.type/long :db.type/bigint :db.type/float :db.type/double :db.type/bigdec
  9. :db.type/instant :db.type/uuid :db.type/uri :db.type/keyword :db.type/bytes :db.type/ref})
  10. (s/def ::tempid
  11. (s/with-gen
  12. (s/or
  13. :dbid #(instance? (Class/forName "datomic.db.DbId") %)
  14. :string (s/and string? #(not (str/starts-with? % ":"))))
  15. (fn [] (gen/return ((resolve 'datomic.api/tempid) :db.part/db)))))
  16. (s/def :db/id
  17. (s/or
  18. :entity-id number?
  19. :lookup-ref (s/tuple keyword? (s/or :string string?
  20. :keyword keyword?
  21. :num number?
  22. :uuid uuid?))
  23. :tempid ::tempid
  24. :ident keyword?))
  25. (s/def :db/ident keyword?)
  26. (s/def :db/valueType datomic-value-types)
  27. (s/def :db/cardinality #{:db.cardinality/one :db.cardinality/many})
  28. (s/def :db/doc string?)
  29. (s/def :db/unique #{:db.unique/value :db.unique/identity})
  30. (s/def :db/index boolean?)
  31. (s/def :db/isComponent boolean?)
  32. (s/def :db/noHistory boolean?)
  33. (s/def :db/fulltext boolean?)
  34. (s/def ::datascript-optional-field-schema (s/keys :opt [:db/doc :db/unique :db/index :db/isComponent]))
  35. (s/def ::datascript-schema
  36. (s/map-of keyword? ::datascript-optional-field-schema))
  37. (s/def ::datomic-optional-field-schema
  38. (s/merge
  39. ::datascript-optional-field-schema
  40. (s/keys :opt [:db/id :db/fulltext :db/noHistory])))
  41. (s/def ::datomic-field-schema
  42. (s/coll-of
  43. (s/merge
  44. ::datomic-optional-field-schema
  45. (s/keys :req [:db/ident :db/valueType :db/cardinality]))))
  46. (s/def ::schema-entry (s/or :att keyword? :att-and-schema (s/tuple keyword? map?)))
  47. (s/def ::custom-type-resolver (s/fspec :args (s/cat :object any?)))
  48. (s/def ::schema-options (s/keys :opt-un [::custom-type-resolver]))