69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package orm
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
"google.golang.org/protobuf/reflect/protodesc"
|
|
"google.golang.org/protobuf/reflect/protoregistry"
|
|
|
|
appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1"
|
|
modulev1alpha1 "cosmossdk.io/api/cosmos/orm/module/v1alpha1"
|
|
ormv1alpha1 "cosmossdk.io/api/cosmos/orm/v1alpha1"
|
|
"cosmossdk.io/core/store"
|
|
"cosmossdk.io/depinject"
|
|
"cosmossdk.io/depinject/appconfig"
|
|
"cosmossdk.io/orm/model/ormdb"
|
|
"cosmossdk.io/orm/model/ormtable"
|
|
)
|
|
|
|
func init() {
|
|
appconfig.RegisterModule(&modulev1alpha1.Module{},
|
|
appconfig.Provide(ProvideModuleDB),
|
|
)
|
|
}
|
|
|
|
// ModuleDBInputs are the inputs to ProvideModuleDB. NOTE: this is intended to be used by depinject.
|
|
type ModuleDBInputs struct {
|
|
depinject.In
|
|
|
|
AppConfig *appv1alpha1.Config
|
|
KVStoreService store.KVStoreService
|
|
MemoryStoreService store.MemoryStoreService `optional:"true"`
|
|
TransientStoreService store.TransientStoreService `optional:"true"`
|
|
TypeResolver ormtable.TypeResolver `optional:"true"`
|
|
FileResolver protodesc.Resolver `optional:"true"`
|
|
}
|
|
|
|
// ProvideModuleDB provides an ORM ModuleDB scoped to a module. NOTE: this is intended to be used by depinject.
|
|
func ProvideModuleDB(moduleKey depinject.ModuleKey, inputs ModuleDBInputs) (ormdb.ModuleDB, error) {
|
|
for _, module := range inputs.AppConfig.Modules {
|
|
if module.Name == moduleKey.Name() {
|
|
typeResolver := inputs.TypeResolver
|
|
if typeResolver == nil {
|
|
typeResolver = protoregistry.GlobalTypes
|
|
}
|
|
|
|
modTyp, err := typeResolver.FindMessageByURL(module.Config.TypeUrl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
modSchema := proto.GetExtension(modTyp.Descriptor().Options(), ormv1alpha1.E_ModuleSchema).(*ormv1alpha1.ModuleSchemaDescriptor)
|
|
if modSchema == nil {
|
|
return nil, fmt.Errorf("no schema for module %s", moduleKey.Name())
|
|
}
|
|
|
|
return ormdb.NewModuleDB(modSchema, ormdb.ModuleDBOptions{
|
|
TypeResolver: inputs.TypeResolver,
|
|
FileResolver: inputs.FileResolver,
|
|
KVStoreService: inputs.KVStoreService,
|
|
MemoryStoreService: inputs.MemoryStoreService,
|
|
TransientStoreService: inputs.TransientStoreService,
|
|
})
|
|
}
|
|
}
|
|
|
|
return nil, fmt.Errorf("unable to find config for module %s", moduleKey.Name())
|
|
}
|