117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/pflag"
|
|
|
|
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
|
|
"cosmossdk.io/client/v2/autocli"
|
|
"cosmossdk.io/core/transaction"
|
|
"cosmossdk.io/depinject"
|
|
"cosmossdk.io/log"
|
|
"cosmossdk.io/runtime/v2"
|
|
serverv2 "cosmossdk.io/server/v2"
|
|
"cosmossdk.io/simapp/v2"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node"
|
|
)
|
|
|
|
func NewRootCmd[T transaction.Tx](
|
|
args ...string,
|
|
) (*cobra.Command, error) {
|
|
rootCommand := &cobra.Command{
|
|
Use: "simdv2",
|
|
SilenceErrors: true,
|
|
}
|
|
configWriter, err := InitRootCmd(rootCommand, log.NewNopLogger(), CommandDependencies[T]{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
factory, err := serverv2.NewCommandFactory(
|
|
serverv2.WithConfigWriter(configWriter),
|
|
serverv2.WithStdDefaultHomeDir(".simappv2"),
|
|
serverv2.WithLoggerFactory(serverv2.NewLogger),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
nodeCmds := nodeservice.NewNodeCommands()
|
|
autoCLIModuleOpts := make(map[string]*autocliv1.ModuleOptions)
|
|
autoCLIModuleOpts[nodeCmds.Name()] = nodeCmds.AutoCLIOptions()
|
|
autoCliOpts, err := autocli.NewAppOptionsFromConfig(
|
|
depinject.Configs(simapp.AppConfig(), depinject.Supply(runtime.GlobalConfig{})),
|
|
autoCLIModuleOpts,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = autoCliOpts.EnhanceRootCommand(rootCommand); err != nil {
|
|
return nil, err
|
|
}
|
|
subCommand, configMap, logger, err := factory.ParseCommand(rootCommand, args)
|
|
if err != nil {
|
|
if errors.Is(err, pflag.ErrHelp) {
|
|
return rootCommand, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
var (
|
|
moduleManager *runtime.MM[T]
|
|
clientCtx client.Context
|
|
simApp *simapp.SimApp[T]
|
|
depinjectConfig = depinject.Configs(
|
|
depinject.Supply(logger, runtime.GlobalConfig(configMap)),
|
|
depinject.Provide(ProvideClientContext),
|
|
)
|
|
)
|
|
if serverv2.IsAppRequired(subCommand) {
|
|
// server construction
|
|
simApp, err = simapp.NewSimApp[T](depinjectConfig, &autoCliOpts, &moduleManager, &clientCtx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
// client construction
|
|
if err = depinject.Inject(
|
|
depinject.Configs(
|
|
simapp.AppConfig(),
|
|
depinjectConfig,
|
|
),
|
|
&autoCliOpts, &moduleManager, &clientCtx,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
commandDeps := CommandDependencies[T]{
|
|
GlobalConfig: configMap,
|
|
TxConfig: clientCtx.TxConfig,
|
|
ModuleManager: moduleManager,
|
|
SimApp: simApp,
|
|
ClientContext: clientCtx,
|
|
}
|
|
rootCommand = &cobra.Command{
|
|
Use: "simdv2",
|
|
Short: "simulation app",
|
|
SilenceErrors: true,
|
|
PersistentPreRunE: RootCommandPersistentPreRun(clientCtx),
|
|
}
|
|
factory.EnhanceRootCommand(rootCommand)
|
|
_, err = InitRootCmd(rootCommand, logger, commandDeps)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
autoCliOpts.ModuleOptions = autoCLIModuleOpts
|
|
if err := autoCliOpts.EnhanceRootCommand(rootCommand); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return rootCommand, nil
|
|
}
|