fix(simapp/v2): full AutoCLI support (#22410)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package autocli
|
||||
|
||||
import (
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"github.com/spf13/cobra"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
@@ -9,12 +10,15 @@ import (
|
||||
"cosmossdk.io/client/v2/autocli/flag"
|
||||
"cosmossdk.io/core/appmodule"
|
||||
"cosmossdk.io/depinject"
|
||||
"cosmossdk.io/log"
|
||||
"cosmossdk.io/x/tx/signing"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
sdkflags "github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||
)
|
||||
|
||||
// AppOptions are autocli options for an app. These options can be built via depinject based on an app config. Ex:
|
||||
// AppOptions are input options for an autocli enabled app. These options can be built via depinject based on an app config.
|
||||
// Ex:
|
||||
//
|
||||
// var autoCliOpts autocli.AppOptions
|
||||
@@ -36,6 +40,8 @@ type AppOptions struct {
|
||||
|
||||
// ClientCtx contains the necessary information needed to execute the commands.
|
||||
ClientCtx client.Context
|
||||
|
||||
skipValidation bool
|
||||
}
|
||||
|
||||
// EnhanceRootCommand enhances the provided root command with autocli AppOptions,
|
||||
@@ -76,8 +82,10 @@ func (appOptions AppOptions) EnhanceRootCommand(rootCmd *cobra.Command) error {
|
||||
}
|
||||
|
||||
func (appOptions AppOptions) EnhanceRootCommandWithBuilder(rootCmd *cobra.Command, builder *Builder) error {
|
||||
if err := builder.ValidateAndComplete(); err != nil {
|
||||
return err
|
||||
if !appOptions.skipValidation {
|
||||
if err := builder.ValidateAndComplete(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// extract any custom commands from modules
|
||||
@@ -127,3 +135,49 @@ func (appOptions AppOptions) EnhanceRootCommandWithBuilder(rootCmd *cobra.Comman
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewAppOptionsFromConfig returns AppOptions for an app based on the provided modulesConfig and moduleOptions.
|
||||
// It returns an AppOptions instance usable for CLI parsing but not execution. For an execution usable AppOptions
|
||||
// see ProvideAppOptions, which expects input to be filled by depinject.
|
||||
func NewAppOptionsFromConfig(
|
||||
modulesConfig depinject.Config,
|
||||
moduleOptions map[string]*autocliv1.ModuleOptions,
|
||||
) (AppOptions, error) {
|
||||
interfaceRegistry, err := types.NewInterfaceRegistryWithOptions(types.InterfaceRegistryOptions{
|
||||
ProtoFiles: proto.HybridResolver,
|
||||
SigningOptions: signing.Options{
|
||||
AddressCodec: nopAddressCodec{},
|
||||
ValidatorAddressCodec: nopAddressCodec{},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return AppOptions{}, err
|
||||
}
|
||||
cfg := struct {
|
||||
depinject.In
|
||||
Modules map[string]appmodule.AppModule
|
||||
}{
|
||||
Modules: nil,
|
||||
}
|
||||
err = depinject.Inject(depinject.Configs(
|
||||
modulesConfig,
|
||||
depinject.Supply(
|
||||
log.NewNopLogger(),
|
||||
)), &cfg)
|
||||
if err != nil {
|
||||
return AppOptions{}, err
|
||||
}
|
||||
|
||||
return AppOptions{
|
||||
Modules: cfg.Modules,
|
||||
ClientCtx: client.Context{InterfaceRegistry: interfaceRegistry},
|
||||
ModuleOptions: moduleOptions,
|
||||
skipValidation: true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
type nopAddressCodec struct{}
|
||||
|
||||
func (nopAddressCodec) StringToBytes(_ string) ([]byte, error) { return nil, nil }
|
||||
|
||||
func (nopAddressCodec) BytesToString(_ []byte) (string, error) { return "", nil }
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ go 1.23.1
|
||||
require (
|
||||
cosmossdk.io/api v0.7.6
|
||||
cosmossdk.io/core v1.0.0-alpha.5
|
||||
cosmossdk.io/depinject v1.0.0
|
||||
cosmossdk.io/depinject v1.1.0
|
||||
cosmossdk.io/x/bank v0.0.0-20240226161501-23359a0b6d91
|
||||
cosmossdk.io/x/gov v0.0.0-20231113122742-912390d5fc4a
|
||||
cosmossdk.io/x/tx v1.0.0-alpha.1
|
||||
@@ -26,7 +26,7 @@ require (
|
||||
cosmossdk.io/collections v0.4.1-0.20241104084251-838f1557af0a // indirect
|
||||
cosmossdk.io/core/testing v0.0.0-20240923163230-04da382a9f29 // indirect
|
||||
cosmossdk.io/errors v1.0.1 // indirect
|
||||
cosmossdk.io/log v1.4.1 // indirect
|
||||
cosmossdk.io/log v1.4.1
|
||||
cosmossdk.io/math v1.3.0
|
||||
cosmossdk.io/schema v0.3.1-0.20241010135032-192601639cac // indirect
|
||||
cosmossdk.io/store v1.1.1-0.20240418092142-896cdf1971bc // indirect
|
||||
|
||||
+2
-2
@@ -10,8 +10,8 @@ cosmossdk.io/core v1.0.0-alpha.5 h1:McjYXAQ6XcT20v2uHyH7PhoWH8V+mebzfVFqT3GinsI=
|
||||
cosmossdk.io/core v1.0.0-alpha.5/go.mod h1:3u9cWq1FAVtiiCrDPpo4LhR+9V6k/ycSG4/Y/tREWCY=
|
||||
cosmossdk.io/core/testing v0.0.0-20240923163230-04da382a9f29 h1:NxxUo0GMJUbIuVg0R70e3cbn9eFTEuMr7ev1AFvypdY=
|
||||
cosmossdk.io/core/testing v0.0.0-20240923163230-04da382a9f29/go.mod h1:8s2tPeJtSiQuoyPmr2Ag7meikonISO4Fv4MoO8+ORrs=
|
||||
cosmossdk.io/depinject v1.0.0 h1:dQaTu6+O6askNXO06+jyeUAnF2/ssKwrrszP9t5q050=
|
||||
cosmossdk.io/depinject v1.0.0/go.mod h1:zxK/h3HgHoA/eJVtiSsoaRaRA2D5U4cJ5thIG4ssbB8=
|
||||
cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E=
|
||||
cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI=
|
||||
cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0=
|
||||
cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U=
|
||||
cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM=
|
||||
|
||||
Reference in New Issue
Block a user