Open bamarco opened 7 years ago
(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))))))