cosmos-sdk/orm/orm.go
2024-01-13 20:42:45 +00:00

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