cli: refactor flag reading (#6884)
* cli: refactor ReadPersistentCommandFlags * updates * fix tetts * cover all cases * fix tests * fix tests * fix tests * fix tests * godoc++ Co-authored-by: Aaron Craelius <aaron@regen.network>
This commit is contained in:
co-authored by
Aaron Craelius
parent
eb08781e8a
commit
9ccec075e2
+73
-42
@@ -77,20 +77,27 @@ func ValidateCmd(cmd *cobra.Command, args []string) error {
|
||||
}
|
||||
|
||||
// ReadPersistentCommandFlags returns a Context with fields set for "persistent"
|
||||
// flags that do not necessarily change with context. These must be checked if
|
||||
// the caller explicitly changed the values.
|
||||
// or common flags that do not necessarily change with context.
|
||||
//
|
||||
// Note, the provided clientCtx may have field pre-populated. The following order
|
||||
// of precedence occurs:
|
||||
//
|
||||
// - client.Context field not pre-populated & flag not set: uses default flag value
|
||||
// - client.Context field not pre-populated & flag set: uses set flag value
|
||||
// - client.Context field pre-populated & flag not set: uses pre-populated value
|
||||
// - client.Context field pre-populated & flag set: uses set flag value
|
||||
func ReadPersistentCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Context, error) {
|
||||
if flagSet.Changed(cli.OutputFlag) {
|
||||
if clientCtx.OutputFormat == "" || flagSet.Changed(cli.OutputFlag) {
|
||||
output, _ := flagSet.GetString(cli.OutputFlag)
|
||||
clientCtx = clientCtx.WithOutputFormat(output)
|
||||
}
|
||||
|
||||
if flagSet.Changed(flags.FlagHome) {
|
||||
if clientCtx.HomeDir == "" || flagSet.Changed(flags.FlagHome) {
|
||||
homeDir, _ := flagSet.GetString(flags.FlagHome)
|
||||
clientCtx = clientCtx.WithHomeDir(homeDir)
|
||||
}
|
||||
|
||||
if flagSet.Changed(flags.FlagChainID) {
|
||||
if clientCtx.ChainID == "" || flagSet.Changed(flags.FlagChainID) {
|
||||
chainID, _ := flagSet.GetString(flags.FlagChainID)
|
||||
clientCtx = clientCtx.WithChainID(chainID)
|
||||
}
|
||||
@@ -119,60 +126,84 @@ func ReadPersistentCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Cont
|
||||
}
|
||||
|
||||
// ReadQueryCommandFlags returns an updated Context with fields set based on flags
|
||||
// defined in GetCommands. An error is returned if any flag query fails.
|
||||
// defined in AddQueryFlagsToCmd. An error is returned if any flag query fails.
|
||||
//
|
||||
// Certain flags are naturally command and context dependent, so for these flags
|
||||
// we do not check if they've been explicitly set by the caller. Other flags can
|
||||
// be considered "persistent" (e.g. KeyBase or Client) and these should be checked
|
||||
// if the caller explicitly set those.
|
||||
// Note, the provided clientCtx may have field pre-populated. The following order
|
||||
// of precedence occurs:
|
||||
//
|
||||
// - client.Context field not pre-populated & flag not set: uses default flag value
|
||||
// - client.Context field not pre-populated & flag set: uses set flag value
|
||||
// - client.Context field pre-populated & flag not set: uses pre-populated value
|
||||
// - client.Context field pre-populated & flag set: uses set flag value
|
||||
func ReadQueryCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Context, error) {
|
||||
height, _ := flagSet.GetInt64(flags.FlagHeight)
|
||||
clientCtx = clientCtx.WithHeight(height)
|
||||
if clientCtx.Height == 0 || flagSet.Changed(flags.FlagHeight) {
|
||||
height, _ := flagSet.GetInt64(flags.FlagHeight)
|
||||
clientCtx = clientCtx.WithHeight(height)
|
||||
}
|
||||
|
||||
useLedger, _ := flagSet.GetBool(flags.FlagUseLedger)
|
||||
clientCtx = clientCtx.WithUseLedger(useLedger)
|
||||
if !clientCtx.UseLedger || flagSet.Changed(flags.FlagUseLedger) {
|
||||
useLedger, _ := flagSet.GetBool(flags.FlagUseLedger)
|
||||
clientCtx = clientCtx.WithUseLedger(useLedger)
|
||||
}
|
||||
|
||||
return ReadPersistentCommandFlags(clientCtx, flagSet)
|
||||
}
|
||||
|
||||
// ReadTxCommandFlags returns an updated Context with fields set based on flags
|
||||
// defined in PostCommands. An error is returned if any flag query fails.
|
||||
// defined in AddTxFlagsToCmd. An error is returned if any flag query fails.
|
||||
//
|
||||
// Certain flags are naturally command and context dependent, so for these flags
|
||||
// we do not check if they've been explicitly set by the caller. Other flags can
|
||||
// be considered "persistent" (e.g. KeyBase or Client) and these should be checked
|
||||
// if the caller explicitly set those.
|
||||
// Note, the provided clientCtx may have field pre-populated. The following order
|
||||
// of precedence occurs:
|
||||
//
|
||||
// - client.Context field not pre-populated & flag not set: uses default flag value
|
||||
// - client.Context field not pre-populated & flag set: uses set flag value
|
||||
// - client.Context field pre-populated & flag not set: uses pre-populated value
|
||||
// - client.Context field pre-populated & flag set: uses set flag value
|
||||
func ReadTxCommandFlags(clientCtx Context, flagSet *pflag.FlagSet) (Context, error) {
|
||||
clientCtx, err := ReadPersistentCommandFlags(clientCtx, flagSet)
|
||||
if err != nil {
|
||||
return clientCtx, err
|
||||
}
|
||||
|
||||
genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly)
|
||||
clientCtx = clientCtx.WithGenerateOnly(genOnly)
|
||||
|
||||
dryRun, _ := flagSet.GetBool(flags.FlagDryRun)
|
||||
clientCtx = clientCtx.WithSimulation(dryRun)
|
||||
|
||||
offline, _ := flagSet.GetBool(flags.FlagOffline)
|
||||
clientCtx = clientCtx.WithOffline(offline)
|
||||
|
||||
useLedger, _ := flagSet.GetBool(flags.FlagUseLedger)
|
||||
clientCtx = clientCtx.WithUseLedger(useLedger)
|
||||
|
||||
bMode, _ := flagSet.GetString(flags.FlagBroadcastMode)
|
||||
clientCtx = clientCtx.WithBroadcastMode(bMode)
|
||||
|
||||
skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation)
|
||||
clientCtx = clientCtx.WithSkipConfirmation(skipConfirm)
|
||||
|
||||
from, _ := flagSet.GetString(flags.FlagFrom)
|
||||
fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly)
|
||||
if err != nil {
|
||||
return clientCtx, err
|
||||
if !clientCtx.GenerateOnly || flagSet.Changed(flags.FlagGenerateOnly) {
|
||||
genOnly, _ := flagSet.GetBool(flags.FlagGenerateOnly)
|
||||
clientCtx = clientCtx.WithGenerateOnly(genOnly)
|
||||
}
|
||||
|
||||
clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName)
|
||||
if !clientCtx.Simulate || flagSet.Changed(flags.FlagDryRun) {
|
||||
dryRun, _ := flagSet.GetBool(flags.FlagDryRun)
|
||||
clientCtx = clientCtx.WithSimulation(dryRun)
|
||||
}
|
||||
|
||||
if !clientCtx.Offline || flagSet.Changed(flags.FlagOffline) {
|
||||
offline, _ := flagSet.GetBool(flags.FlagOffline)
|
||||
clientCtx = clientCtx.WithOffline(offline)
|
||||
}
|
||||
|
||||
if !clientCtx.UseLedger || flagSet.Changed(flags.FlagUseLedger) {
|
||||
useLedger, _ := flagSet.GetBool(flags.FlagUseLedger)
|
||||
clientCtx = clientCtx.WithUseLedger(useLedger)
|
||||
}
|
||||
|
||||
if clientCtx.BroadcastMode == "" || flagSet.Changed(flags.FlagBroadcastMode) {
|
||||
bMode, _ := flagSet.GetString(flags.FlagBroadcastMode)
|
||||
clientCtx = clientCtx.WithBroadcastMode(bMode)
|
||||
}
|
||||
|
||||
if !clientCtx.SkipConfirm || flagSet.Changed(flags.FlagSkipConfirmation) {
|
||||
skipConfirm, _ := flagSet.GetBool(flags.FlagSkipConfirmation)
|
||||
clientCtx = clientCtx.WithSkipConfirmation(skipConfirm)
|
||||
}
|
||||
|
||||
if clientCtx.From == "" || flagSet.Changed(flags.FlagFrom) {
|
||||
from, _ := flagSet.GetString(flags.FlagFrom)
|
||||
fromAddr, fromName, err := GetFromFields(clientCtx.Keyring, from, clientCtx.GenerateOnly)
|
||||
if err != nil {
|
||||
return clientCtx, err
|
||||
}
|
||||
|
||||
clientCtx = clientCtx.WithFrom(from).WithFromAddress(fromAddr).WithFromName(fromName)
|
||||
}
|
||||
|
||||
return clientCtx, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user