diff --git a/src/darkleaf/di/core.clj b/src/darkleaf/di/core.clj index 5ef8aa10..15d5cf09 100644 --- a/src/darkleaf/di/core.clj +++ b/src/darkleaf/di/core.clj @@ -806,20 +806,28 @@ :cmap cmap})) (registry key)))))) -;; (defn rename-deps [target rmap] -;; (let [inverted-rmap (set/map-invert rmap)] -;; (fn [registry] -;; (fn [key] -;; (let [factory (registry key)] -;; (if (= target key) -;; (reify p/Factory -;; (dependencies [_] -;; (let [deps (p/dependencies factory)] -;; (set/rename-keys deps rmap))) -;; (build [this deps] -;; (let [deps (set/rename-keys deps inverted-rmap)] -;; (p/build factory deps)))) -;; factory)))))) +(defn redefine-deps [target & {:as mapping}] + (fn [registry] + (fn [key] + (let [factory (registry key)] + (if (= target key) + (reify p/Factory + (dependencies [_] + (let [deps (into {} + (remove (fn [[k _]] (contains? mapping k))) + (p/dependencies factory)) + mapping-deps (transduce (map p/dependencies) + combine-dependencies + (vals mapping))] + (combine-dependencies deps mapping-deps))) + (build [_ deps add-stop] + (let [mapping-deps (update-vals mapping #(p/build % deps add-stop)) + deps (merge deps mapping-deps)] + (p/build factory deps add-stop))) + (description [_] + ;; todo: add description + (p/description factory))) + factory))))) (defn- usefull-var? [var] diff --git a/test/darkleaf/di/tutorial/x_override_deps_test.clj b/test/darkleaf/di/tutorial/x_override_deps_test.clj index e6664cbb..a20c7c24 100644 --- a/test/darkleaf/di/tutorial/x_override_deps_test.clj +++ b/test/darkleaf/di/tutorial/x_override_deps_test.clj @@ -3,21 +3,24 @@ [clojure.test :as t] [darkleaf.di.core :as di])) -;; (defn a [{dep ::dep -;; common ::common}] -;; [:a dep common]) +(defn a + {::di/kind :component} + [{dep ::dep + common ::common}] + [:a dep common]) -;; (defn b [{dep ::dep -;; common ::common}] -;; [:b dep common]) +(defn b + {::di/kind :component} + [{dep ::dep + common ::common}] + [:b dep common]) -;; (t/deftest ok -;; (with-open [root (di/start [`a `b] -;; {::dep-a :dep-a -;; ::dep-b :dep-b -;; ::common :c} -;; (di/rename-deps `a {::dep ::dep-a}) -;; (di/rename-deps `b {::dep ::dep-b}))] -;; (let [[a b] root] -;; (t/is (= [:a :dep-a :c] a)) -;; (t/is (= [:b :dep-b :c] b))))) +(t/deftest ok + (with-open [root (di/start [`a `b] + {::dep-a :dep-a + ::common :c} + (di/redefine-deps `a ::dep (di/ref ::dep-a)) + (di/redefine-deps `b ::dep :dep-b))] + (let [[a b] root] + (t/is (= [:a :dep-a :c] a)) + (t/is (= [:b :dep-b :c] b)))))