diff --git a/src/pluto/reader/types.cljc b/src/pluto/reader/types.cljc index 88d7023..26ebcb1 100644 --- a/src/pluto/reader/types.cljc +++ b/src/pluto/reader/types.cljc @@ -73,17 +73,21 @@ {} type) {:errors [(errors/error ::errors/invalid-assoc-type {:type type :value value})]})) -(defmethod resolve :event [ctx ext type [event-name event-properties :as value]] +(defn- resolve-reference [ctx ext type [name _ :as value] f error] (let [{:keys [data errors]} (reference/resolve ctx ext type value)] - (errors/merge-errors {:data #(re-frame/dispatch (if event-properties [data event-properties] [data]))} - (when errors - {:errors (apply conj errors [(errors/error ::errors/unknown-event {:type type :value name})])})))) + (merge (when data {:data (f data)}) + (when errors + {:errors (apply conj [(errors/error error name)] errors)})))) -(defmethod resolve :query [ctx ext type [properties name :as value]] - (let [{:keys [data errors]} (reference/resolve ctx ext type value)] - (errors/merge-errors {:data #(re-frame/subscribe (if properties [data properties] [data]))} - (when errors - {:errors (apply conj errors [(errors/error ::errors/unknown-query {:type type :value name})])})))) +(defmethod resolve :event [ctx ext type [_ properties :as value]] + (resolve-reference ctx ext type value + (fn [data] #(re-frame/dispatch (if properties [data properties] [data]))) + ::errors/unknown-event)) + +(defmethod resolve :query [ctx ext type [name properties :as value]] + (resolve-reference ctx ext type value + (fn [data] #(re-frame/subscribe (if properties [data properties] [data]))) + ::errors/unknown-query)) (defmethod resolve :default [_ _ type value] {:errors [(errors/error ::errors/invalid-type (merge {:type type} (when value {:value value})))]}) diff --git a/src/pluto/reader/views.cljc b/src/pluto/reader/views.cljc index f91cfc6..d233965 100644 --- a/src/pluto/reader/views.cljc +++ b/src/pluto/reader/views.cljc @@ -110,6 +110,7 @@ (defn parse [ctx ext o] (if (list? o) ;; TODO introduce a block? fn (let [{:keys [data errors] :as m} (blocks/parse ctx ext o)] + ;; TODO handle nil data case (errors/merge-errors (parse ctx ext data) errors)) (parse-hiccup-element ctx ext o))) diff --git a/test/pluto/reader/types_test.cljc b/test/pluto/reader/types_test.cljc index da0227d..4ce7060 100644 --- a/test/pluto/reader/types_test.cljc +++ b/test/pluto/reader/types_test.cljc @@ -101,3 +101,13 @@ :name "hello" :children [{:name "name" :scopes [{:scope :one}]} {:name "name" :scopes [{:scope :two}]}]})))) + +(deftest resolve-reference + (is (= {:errors [{::errors/type ::errors/unknown-event + ::errors/value 'event} + {::errors/type ::errors/unknown-reference + ::errors/value {:value 'event}}]} + (types/resolve {} {} :event ['event]))) + (let [{:keys [data errors]} (types/resolve {:capacities {:events {'event {:value :event}}}} {} :event ['event])] + (is (not errors)) + (is data)))