Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
kocubinski committed Oct 24, 2024
1 parent fc68979 commit 348028f
Show file tree
Hide file tree
Showing 7 changed files with 211 additions and 159 deletions.
12 changes: 0 additions & 12 deletions client/v2/helpers/command.go

This file was deleted.

24 changes: 0 additions & 24 deletions client/v2/helpers/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,3 @@ func GetNodeHomeDirectory(name string) (string, error) {

return filepath.Join(userHomeDir, name), nil
}

func DefaultHomeDir(name string) (string, error) {
// get the home directory from the environment variable
// to not clash with the $HOME system variable, when no prefix is set
// we check the NODE_HOME environment variable
envPrefix := EnvPrefix
homeDir, envHome := "", "HOME"
if len(envPrefix) > 0 {
homeDir = os.Getenv(envPrefix + "_" + envHome)
} else {
homeDir = os.Getenv("NODE_" + envHome)
}
if homeDir != "" {
return filepath.Clean(homeDir), nil
}

// get user home directory
userHomeDir, err := os.UserHomeDir()
if err != nil {
return "", err
}

return filepath.Join(userHomeDir, name), nil
}
145 changes: 144 additions & 1 deletion server/v2/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,161 @@ import (
"errors"
"os"
"os/signal"
"path/filepath"
"runtime/pprof"
"strings"
"syscall"

"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"

"cosmossdk.io/core/server"
"cosmossdk.io/core/transaction"
"cosmossdk.io/log"
)

type RootCmdBuilder struct {
DefaultHome string
EnvPrefix string

use string
fixture CommandFixture
vipr *viper.Viper
logger log.Logger
subCommand *cobra.Command
config server.ConfigMap
}

type CommandFixture interface {
Bootstrap(cmd *cobra.Command) (WritesConfig, error)
RootCommand(
rootCommand *cobra.Command,
subCommand *cobra.Command,
logger log.Logger,
config server.ConfigMap,
) (*cobra.Command, error)
}

func NewRootCmdBuilder(
fixture CommandFixture,
use string,
defaultHomeBasename string,
) (*RootCmdBuilder, error) {
f := &RootCmdBuilder{
fixture: fixture,
use: use,
}
var err error
f.DefaultHome, err = f.DefaultHomeDir(defaultHomeBasename)
if err != nil {
return nil, err
}
return f, nil
}

func (b *RootCmdBuilder) Logger() log.Logger {
return b.logger
}

func (b *RootCmdBuilder) SubCommand() *cobra.Command {
return b.subCommand
}

func (b *RootCmdBuilder) Config() server.ConfigMap {
return b.config
}

func (b *RootCmdBuilder) DefaultHomeDir(name string) (string, error) {
// get the home directory from the environment variable
// to not clash with the $HOME system variable, when no prefix is set
// we check the NODE_HOME environment variable
homeDir, envHome := "", "HOME"
if len(b.EnvPrefix) > 0 {
homeDir = os.Getenv(b.EnvPrefix + "_" + envHome)
} else {
homeDir = os.Getenv("NODE_" + envHome)
}
if homeDir != "" {
return filepath.Clean(homeDir), nil
}

// get user home directory
userHomeDir, err := os.UserHomeDir()
if err != nil {
return "", err
}

return filepath.Join(userHomeDir, name), nil
}

func (b *RootCmdBuilder) Command() (*cobra.Command, error) {
cmd := &cobra.Command{Use: b.use, SilenceErrors: true}
SetPersistentFlags(cmd.PersistentFlags(), b.DefaultHome)
// update the global viper with the root command's configuration
viper.SetEnvPrefix(b.EnvPrefix)
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
viper.AutomaticEnv()
if b.vipr != nil && b.logger != nil {
err := SetCmdServerContext(cmd, b.vipr, b.logger)
if err != nil {
return nil, err
}
}
return cmd, nil
}

func (b *RootCmdBuilder) Build(
args []string,
) (*cobra.Command, error) {
cmd, err := b.Command()
if err != nil {
return nil, err
}
configWriter, err := b.fixture.Bootstrap(cmd)
if err != nil {
return nil, err
}
b.subCommand, _, err = cmd.Traverse(args)
if err != nil {
return nil, err
}
if err = cmd.ParseFlags(args); err != nil {
// help requested, return the command early
if errors.Is(err, pflag.ErrHelp) {
return cmd, nil
}
return nil, err
}
home, err := cmd.Flags().GetString(FlagHome)
if err != nil {
return nil, err
}
configDir := filepath.Join(home, "config")
// create app.toml if it does not already exist
if _, err = os.Stat(filepath.Join(configDir, "app.toml")); os.IsNotExist(err) {
if err = configWriter.WriteConfig(configDir); err != nil {
return nil, err
}
}
b.vipr, err = ReadConfig(configDir)
if err != nil {
return nil, err
}
if err = b.vipr.BindPFlags(cmd.Flags()); err != nil {
return nil, err
}
b.logger, err = NewLogger(b.vipr, cmd.OutOrStdout())
if err != nil {
return nil, err
}
b.config = b.vipr.AllSettings()

return b.fixture.RootCommand(cmd, b.subCommand, b.logger, b.config)
}

// SetPersistentFlags sets persistent flags which should be used by all server (and client)
// commands. They control logging behavior and home directory.
func SetPersistentFlags(pflags *pflag.FlagSet, defaultHome string) {
pflags.String(FlagLogLevel, "info", "The logging level (trace|debug|info|warn|error|fatal|panic|disabled or '*:<level>,<key>:<level>')")
pflags.String(FlagLogFormat, "plain", "The logging format (json|plain)")
Expand All @@ -32,7 +175,7 @@ func AddCommands[T transaction.Tx](
globalAppConfig server.ConfigMap,
globalServerConfig ServerConfig,
components ...ServerComponent[T],
) (interface{ WriteConfig(string) error }, error) {
) (WritesConfig, error) {
if len(components) == 0 {
return nil, errors.New("no components provided")
}
Expand Down
5 changes: 5 additions & 0 deletions server/v2/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ type HasConfig interface {
Config() any
}

// WritesConfig is a server module that can write its config to a file.
type WritesConfig interface {
WriteConfig(path string) error
}

// HasCLICommands is a server module that has CLI commands.
type HasCLICommands interface {
CLICommands() CLIConfig
Expand Down
11 changes: 2 additions & 9 deletions simapp/v2/simdv2/cmd/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ import (
v2 "github.com/cosmos/cosmos-sdk/x/genutil/v2/cli"
)

type configWriter interface {
WriteConfig(filename string) error
}

// commandDependencies is a struct that contains all the dependencies needed to initialize the root command.
// an alternative design could fetch these even later from the command context
type commandDependencies[T transaction.Tx] struct {
Expand All @@ -48,7 +44,7 @@ func initRootCmd[T transaction.Tx](
rootCmd *cobra.Command,
logger log.Logger,
deps commandDependencies[T],
) (configWriter, error) {
) (serverv2.WritesConfig, error) {
cfg := sdk.GetConfig()
cfg.Seal()

Expand All @@ -57,10 +53,7 @@ func initRootCmd[T transaction.Tx](
debug.Cmd(),
confixcmd.ConfigCommand(),
NewTestnetCmd(deps.moduleManager),
)

// add keybase, auxiliary RPC, query, genesis, and tx child commands
rootCmd.AddCommand(
// add keybase, auxiliary RPC, query, genesis, and tx child commands
genesisCommand(deps.moduleManager, deps.simApp),
queryCommand(),
txCommand(),
Expand Down
Loading

0 comments on commit 348028f

Please sign in to comment.