metasoarous / datview

Effortlessly compose data visualizations and controls for Datomic and DataScript data
Eclipse Public License 1.0
25 stars 5 forks source link

spec for pull data #11

Open bamarco opened 7 years ago

bamarco commented 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))))))