Skip to content

Commit

Permalink
revert to standard maps for a-frame data-paths
Browse files Browse the repository at this point in the history
records are causing problems around c.t.n.r/refresh
  • Loading branch information
mccraigmccraig committed May 30, 2023
1 parent c1d3d58 commit d32c20a
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 60 deletions.
31 changes: 17 additions & 14 deletions src/a_frame/interceptor_chain/data.cljc
Original file line number Diff line number Diff line change
@@ -1,38 +1,41 @@
(ns a-frame.interceptor-chain.data
(:require
[a-frame.interceptor-chain.data.protocols :as p]
[a-frame.interceptor-chain.data.data-path]
[a-frame.interceptor-chain.data.data-path :as data-path]
[taoensso.timbre :refer [info warn]])
(:import
#?(:clj [clojure.lang IPersistentMap IPersistentVector])))

(declare resolve-data)

(defn resolve-data-path-map
[spec interceptor-ctx]

(if (data-path/data-path? spec)

(data-path/resolve-data-impl spec interceptor-ctx)

(into
{}
(for [[k v] spec]
(let [rv (resolve-data v interceptor-ctx)]
[k rv])))))

(extend-protocol p/IResolveData
#?@(:clj
[IPersistentMap
(-resolve-data [spec interceptor-ctx]
;; (warn "resolve-data MAP")
(into
{}
(for [[k v] spec]
(let [rv (resolve-data v interceptor-ctx)]
[k rv]))))])
(resolve-data-path-map spec interceptor-ctx))])

#?@(:cljs
[cljs.core.PersistentHashMap
(-resolve-data [spec interceptor-ctx]
(into
{}
(for [[k v] spec]
[k (resolve-data v interceptor-ctx)])))
(resolve-data-path-map spec interceptor-ctx))

cljs.core.PersistentArrayMap
(-resolve-data [spec interceptor-ctx]
(into
{}
(for [[k v] spec]
[k (resolve-data v interceptor-ctx)])))])
(resolve-data-path-map spec interceptor-ctx))])

#?(:clj IPersistentVector
:cljs cljs.core.PersistentVector)
Expand Down
66 changes: 20 additions & 46 deletions src/a_frame/interceptor_chain/data/data_path.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -2,65 +2,39 @@
(:require
#?(:clj [clojure.pprint :as pprint])
[a-frame.interceptor-chain.data.protocols :as p]
[a-frame.interceptor-chain.data :as-alias data]
[taoensso.timbre :refer [info warn]]))

;; this protocol is for the cljs IPrintWithWriter
;; method, because there is no .path getter
;; wiht a cljs deftype
(defprotocol IDataPath
(-path [_]))

;; don't know why, but cljs compile doesn't agree
;; with deftype here - probably some badly
;; documented interaction with the tag-readers
(defrecord DataPath [path maybe?]
p/IResolveData
(-resolve-data [_spec interceptor-ctx]
(let [data (get-in interceptor-ctx path)]
(defn resolve-data-impl
[{path ::data/path
maybe? ::data/maybe?
:as _spec}
interceptor-ctx]
(let [data (get-in interceptor-ctx path)]
;; (warn "resolve DataPath" path)
(when (and (not maybe?)
(nil? data))
(throw (ex-info "nil data" {:path path
:context interceptor-ctx})))
data))

IDataPath
(-path [_]
path))
(defn path-impl
[{path ::data/path
_maybe? ::data/maybe?
:as _spec}]
path)

(defn data-path
([path] (data-path path false))
([path maybe?]
(if (sequential? path)
(->DataPath (vec path) maybe?)
(->DataPath [path] maybe?))))

(defn data-path?
[o]
(instance? DataPath o))

#?(:clj
(defn print-data-path
[dp ^java.io.Writer w]
(.write w "#a-frame.ctx/path ")
(print-method (-path dp) w)))
(let [path (if (sequential? path) (vec path) [path])]

#?(:clj
(defmethod print-method DataPath [this ^java.io.Writer w]
(print-data-path this w)))
;; using a plain map and not a record here because of
;; difficulties with c.t.n.r/refresh reloads
{::data/path path
::data/maybe? maybe?})))

#?(:clj
(defmethod print-dup DataPath [this ^java.io.Writer w]
(print-data-path this w)))

#?(:clj
(.addMethod pprint/simple-dispatch
DataPath
(fn [dp]
(print-data-path dp *out*))))

#?(:cljs
(extend-protocol IPrintWithWriter
DataPath
(-pr-writer [dp writer _]
(write-all writer "#promisespromises.ctx/path " (-path dp) ""))))
(defn data-path?
[o]
(and (map? o) (contains? o ::data/path)))
8 changes: 8 additions & 0 deletions src/a_frame/interceptor_chain/data/protocols.cljc
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
(ns a-frame.interceptor-chain.data.protocols)

(defprotocol IResolveData
:extend-via-metadata true
(-resolve-data [spec data]))

;; this protocol is for the cljs IPrintWithWriter
;; method, because there is no .path getter
;; wiht a cljs deftype
(defprotocol IDataPath
:extend-via-metadata true
(-path [_]))

0 comments on commit d32c20a

Please sign in to comment.