cosmos-sdk/core/appmodule/option.go
Matt Kocubinski d025cf09f8
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>
2022-07-07 23:40:32 +02:00

53 lines
1.7 KiB
Go

package appmodule
import (
"cosmossdk.io/core/internal"
"github.com/cosmos/cosmos-sdk/depinject"
)
// Option is a functional option for implementing modules.
type Option interface {
apply(*internal.ModuleInitializer) error
}
type funcOption func(initializer *internal.ModuleInitializer) error
func (f funcOption) apply(initializer *internal.ModuleInitializer) error {
return f(initializer)
}
// Provide registers providers with the dependency injection system that will be
// run within the module scope. See cosmossdk.io/depinject for
// documentation on the dependency injection system.
func Provide(providers ...interface{}) Option {
return funcOption(func(initializer *internal.ModuleInitializer) error {
for _, provider := range providers {
desc, err := depinject.ExtractProviderDescriptor(provider)
if err != nil {
return err
}
initializer.Providers = append(initializer.Providers, desc)
}
return nil
})
}
// Invoke registers invokers to run with depinject. Each invoker will be called
// at the end of dependency graph configuration in the order in which it was defined. Invokers may not define output
// parameters, although they may return an error, and all of their input parameters will be marked as optional so that
// invokers impose no additional constraints on the dependency graph. Invoker functions should nil-check all inputs.
func Invoke(invokers ...interface{}) Option {
return funcOption(func(initializer *internal.ModuleInitializer) error {
for _, invoker := range invokers {
desc, err := depinject.ExtractInvokerDescriptor(invoker)
if err != nil {
return err
}
initializer.Invokers = append(initializer.Invokers, desc)
}
return nil
})
}