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:
Matt Kocubinski 2022-07-07 16:40:32 -05:00 committed by GitHub
parent a96f8e281c
commit d025cf09f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 8 deletions

View File

@ -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
}

View File

@ -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)
}

View File

@ -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,

View File

@ -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()