diff --git a/src/main/om/next/impl/parser.cljc b/src/main/om/next/impl/parser.cljc index 0769fc3c..c45efe28 100644 --- a/src/main/om/next/impl/parser.cljc +++ b/src/main/om/next/impl/parser.cljc @@ -157,9 +157,11 @@ key))))))) (defn path-meta [x path] - (let [x' (cond->> x - (map? x) (into {} (map (fn [[k v]] [k (path-meta v (conj path k))]))) - (vector? x) (into [] (map-indexed #(path-meta %2 (conj path %1)))))] + (let [x' (cond + (record? x) x + (map? x) (into {} (map (fn [[k v]] [k (path-meta v (conj path k))])) x) + (vector? x) (into [] (map-indexed #(path-meta %2 (conj path %1))) x) + :else x)] (cond-> x' #?(:clj (instance? clojure.lang.IObj x') :cljs (satisfies? IWithMeta x')) diff --git a/src/test/om/next/tests.cljs b/src/test/om/next/tests.cljs index e2811658..e28a95e9 100644 --- a/src/test/om/next/tests.cljs +++ b/src/test/om/next/tests.cljs @@ -236,6 +236,12 @@ {:value v} {:remote true})) +(defmethod read :location + [{:keys [state]} k params] + (if-let [v (get @state k)] + {:value v} + {:remote true})) + (defmethod read :woz/noz [{:keys [state]} k params] (if-let [v (get @state k)] @@ -272,6 +278,16 @@ (is (= (p {:state st} [:foo/bar] :remote) [])) (is (= (p {:state st} [:foo/bar :baz/woz] :remote) [:baz/woz])))) +(defrecord Point [lat lon]) + +(deftest test-parse-defrecord + (let [location (->Point 1 2) + state (atom {:location location}) + result (p {:state state} [:location])] + (is (= result {:location location})) + (is (instance? Point (:location result))) + (is (= (meta result) {:om-path []})))) + (deftest test-value-and-remote (let [st (atom {:woz/noz 1})] (is (= (p {:state st} [:woz/noz]) {:woz/noz 1}))