weavejester / integrant

Micro-framework for data-driven architecture
MIT License
1.24k stars 64 forks source link

is it possible to access a component after it's init-key, but before it gets passed to the next key that depends on it? #92

Closed BlanceXR closed 1 year ago

BlanceXR commented 3 years ago

For example, say I have 2 keys

(defmethod ig/init-key ::config [_ _] 
  (aero/read-config "config.edn"))  ;; => {:db-config {...}, :other-config ...}

(defmethod ig/init-key ::db [_ {:keys [db-config]}]
  (db-init db-config))

in this case, ::db needs db-config, but db-config is inside of the ::config to make it work, I need to either have ::db take in the whole config, and then extract :db-config from it, or to create another key, which takes a whole config, and emits a db-config.

both options are not ideal IMO.

i'd hope to do something like:

{::config {}
 ::db {:db-config (get (ig/ref ::config) :db-config)}}

which apparently won't work since ig/ref is just a ref before it's actually initialized.

prep-key won't cut it either as it technically belongs to ::db as well, which shouldn't know the whole system config being passed around. also prep-key would prep a key universally, where in a monorepo, I could have different ns trying to init the same :core/db for example, but they'd want to prep db differently based on how their config file structure look like

any suggestion?

btw, do you typically make a system config into a component?

weavejester commented 3 years ago

In this situation, I'd read the configuration and incorporate it into the config map before initiation. So:

(-> config
    (merge (aero/read-config "config.edn"))
    (ig/init))
BlanceXR commented 3 years ago

I see, so don't treat system config as a component, but as something that's used to build the ig-config, thanks