(defn mapply [f & args]
(apply f (apply concat (butlast args) (last args))))
(s/def :dat.sys.view.entity.type :datomic.db.ident)
(s/def :dat.sys.view.entity.type.attributes (s/coll-of :datomic.db.ident))
;;(defmulti entity-type :dat.sys.view.entity.type)
(defmulti entity-type :e/type)
;;(s/def :dat.sys.view.entity (s/and map? (s/multi-spec entity-type :dat.sys.view.entity.type)))
(s/def :dat.sys.view.entity (s/and map? (s/multi-spec entity-type :e/type)))
(defonce value-type->spec
{:db.type/string :datomic.db.type.string
:db.type/boolean :datomic.db.type.boolean
:db.type/long :datomic.db.type.long
:db.type/bigint :datomic.db.type.bigint
:db.type/float :datomic.db.type.float
:db.type/double :datomic.db.type.double
:db.type/bigdec :datomic.db.type.bigdec
:db.type/ref :dat.sys.view.entity
:db.type/instant :datomic.db.type.instant
:db.type/uuid :datomic.db.type.uuid
:db.type/uri :datomic.db.type.uri
:db.type/bytes :datomic.db.type.bytes})
(s/def :dat.sys.view.entity/data
(mapply s/or value-type->spec))
(defn dat-entity-schema? [{:as schema
entity-type :e/type ;; :dat.sys.view.entity.type
}]
entity-type)
(defn dat-entity-type? [{:as schema
entity-type :e/type ;; :dat.sys.view.entity.type
}]
(and entity-type (= entity-type :e.type/type ;; :dat.sys.view.entity.type
)))
(defn defschema-attr-specs [schemas]
(for [{attr :db/ident
value-type :db/valueType} schemas]
(s/def attr (value-type->spec value-type))))
(defn defschema-specs [schemas]
(let [entity-types (filter dat-entity-type? schemas)
attr-specs (remove dat-entity-schema? schemas)]
(defschema-attr-specs attr-specs)
(for [{attrs :e.type/attributes ;; :dat.sys.view.entity.type.attributes
e-type :db/ident
} entity-types]
(defmethod entity-type e-type []
(s/keys :req (into [:dat.sys.view.entity.type] attrs))))))