fix(depinject): move non-thread safe write (#12484)
* fix(depinject): move non-thread safe write * remove whitespace * Push invoker descriptor mutation down one more layer Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>
This commit is contained in:
parent
a96f8e281c
commit
d025cf09f8
@ -40,7 +40,7 @@ func Provide(providers ...interface{}) Option {
|
||||
func Invoke(invokers ...interface{}) Option {
|
||||
return funcOption(func(initializer *internal.ModuleInitializer) error {
|
||||
for _, invoker := range invokers {
|
||||
desc, err := depinject.ExtractProviderDescriptor(invoker)
|
||||
desc, err := depinject.ExtractInvokerDescriptor(invoker)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -75,7 +75,7 @@ func InvokeInModule(moduleName string, invokers ...interface{}) Config {
|
||||
|
||||
func invoke(ctr *container, key *moduleKey, invokers []interface{}) error {
|
||||
for _, c := range invokers {
|
||||
rc, err := ExtractProviderDescriptor(c)
|
||||
rc, err := ExtractInvokerDescriptor(c)
|
||||
if err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
|
||||
@ -365,12 +365,6 @@ func (c *container) addInvoker(provider *ProviderDescriptor, key *moduleKey) err
|
||||
return fmt.Errorf("invoker function %s should not return any outputs", provider.Location)
|
||||
}
|
||||
|
||||
// make all inputs optional
|
||||
for i, input := range provider.Inputs {
|
||||
input.Optional = true
|
||||
provider.Inputs[i] = input
|
||||
}
|
||||
|
||||
c.invokers = append(c.invokers, invoker{
|
||||
fn: provider,
|
||||
modKey: key,
|
||||
|
||||
@ -47,6 +47,26 @@ func ExtractProviderDescriptor(provider interface{}) (ProviderDescriptor, error)
|
||||
return expandStructArgsProvider(rctr)
|
||||
}
|
||||
|
||||
func ExtractInvokerDescriptor(provider interface{}) (ProviderDescriptor, error) {
|
||||
rctr, ok := provider.(ProviderDescriptor)
|
||||
if !ok {
|
||||
var err error
|
||||
rctr, err = doExtractProviderDescriptor(provider)
|
||||
|
||||
// mark all inputs as optional
|
||||
for i, input := range rctr.Inputs {
|
||||
input.Optional = true
|
||||
rctr.Inputs[i] = input
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return ProviderDescriptor{}, err
|
||||
}
|
||||
}
|
||||
|
||||
return expandStructArgsProvider(rctr)
|
||||
}
|
||||
|
||||
func doExtractProviderDescriptor(ctr interface{}) (ProviderDescriptor, error) {
|
||||
val := reflect.ValueOf(ctr)
|
||||
typ := val.Type()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user