github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/cmd/bytomcli/commands/bytomcli.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"regexp"
     7  
     8  	"github.com/spf13/cobra"
     9  
    10  	"github.com/bytom/bytom/util"
    11  )
    12  
    13  // bytomcli usage template
    14  var usageTemplate = `Usage:{{if .Runnable}}
    15    {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
    16    {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
    17  
    18  Aliases:
    19    {{.NameAndAliases}}{{end}}{{if .HasExample}}
    20  
    21  Examples:
    22  {{.Example}}{{end}}{{if .HasAvailableSubCommands}}
    23  
    24  Available Commands:
    25      {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletDisable))}}
    26      {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}
    27  
    28    available with wallet enable:
    29      {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletEnable))}}
    30      {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
    31  
    32  Flags:
    33  {{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
    34  
    35  Global Flags:
    36  {{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
    37  
    38  Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
    39    {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
    40  
    41  Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}}
    42  `
    43  
    44  // commandError is an error used to signal different error situations in command handling.
    45  type commandError struct {
    46  	s         string
    47  	userError bool
    48  }
    49  
    50  func (c commandError) Error() string {
    51  	return c.s
    52  }
    53  
    54  func (c commandError) isUserError() bool {
    55  	return c.userError
    56  }
    57  
    58  func newUserError(a ...interface{}) commandError {
    59  	return commandError{s: fmt.Sprintln(a...), userError: true}
    60  }
    61  
    62  func newSystemError(a ...interface{}) commandError {
    63  	return commandError{s: fmt.Sprintln(a...), userError: false}
    64  }
    65  
    66  func newSystemErrorF(format string, a ...interface{}) commandError {
    67  	return commandError{s: fmt.Sprintf(format, a...), userError: false}
    68  }
    69  
    70  // Catch some of the obvious user errors from Cobra.
    71  // We don't want to show the usage message for every error.
    72  // The below may be to generic. Time will show.
    73  var userErrorRegexp = regexp.MustCompile("argument|flag|shorthand")
    74  
    75  func isUserError(err error) bool {
    76  	if cErr, ok := err.(commandError); ok && cErr.isUserError() {
    77  		return true
    78  	}
    79  
    80  	return userErrorRegexp.MatchString(err.Error())
    81  }
    82  
    83  // BytomcliCmd is Bytomcli's root command.
    84  // Every other command attached to BytomcliCmd is a child command to it.
    85  var BytomcliCmd = &cobra.Command{
    86  	Use:   "bytomcli",
    87  	Short: "Bytomcli is a commond line client for bytom core (a.k.a. bytomd)",
    88  	Run: func(cmd *cobra.Command, args []string) {
    89  		if len(args) < 1 {
    90  			cmd.SetUsageTemplate(usageTemplate)
    91  			cmd.Usage()
    92  		}
    93  	},
    94  }
    95  
    96  // Execute adds all child commands to the root command BytomcliCmd and sets flags appropriately.
    97  func Execute() {
    98  
    99  	AddCommands()
   100  	AddTemplateFunc()
   101  
   102  	if _, err := BytomcliCmd.ExecuteC(); err != nil {
   103  		os.Exit(util.ErrLocalExe)
   104  	}
   105  }
   106  
   107  // AddCommands adds child commands to the root command BytomcliCmd.
   108  func AddCommands() {
   109  	BytomcliCmd.AddCommand(createAccessTokenCmd)
   110  	BytomcliCmd.AddCommand(listAccessTokenCmd)
   111  	BytomcliCmd.AddCommand(deleteAccessTokenCmd)
   112  	BytomcliCmd.AddCommand(checkAccessTokenCmd)
   113  
   114  	BytomcliCmd.AddCommand(createAccountCmd)
   115  	BytomcliCmd.AddCommand(deleteAccountCmd)
   116  	BytomcliCmd.AddCommand(listAccountsCmd)
   117  	BytomcliCmd.AddCommand(updateAccountAliasCmd)
   118  	BytomcliCmd.AddCommand(createAccountReceiverCmd)
   119  	BytomcliCmd.AddCommand(listAddressesCmd)
   120  	BytomcliCmd.AddCommand(validateAddressCmd)
   121  	BytomcliCmd.AddCommand(listPubKeysCmd)
   122  
   123  	BytomcliCmd.AddCommand(createAssetCmd)
   124  	BytomcliCmd.AddCommand(getAssetCmd)
   125  	BytomcliCmd.AddCommand(listAssetsCmd)
   126  	BytomcliCmd.AddCommand(updateAssetAliasCmd)
   127  
   128  	BytomcliCmd.AddCommand(getTransactionCmd)
   129  	BytomcliCmd.AddCommand(listTransactionsCmd)
   130  
   131  	BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
   132  	BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
   133  	BytomcliCmd.AddCommand(decodeRawTransactionCmd)
   134  
   135  	BytomcliCmd.AddCommand(listUnspentOutputsCmd)
   136  	BytomcliCmd.AddCommand(listBalancesCmd)
   137  
   138  	BytomcliCmd.AddCommand(rescanWalletCmd)
   139  	BytomcliCmd.AddCommand(walletInfoCmd)
   140  
   141  	BytomcliCmd.AddCommand(buildTransactionCmd)
   142  	BytomcliCmd.AddCommand(signTransactionCmd)
   143  	BytomcliCmd.AddCommand(submitTransactionCmd)
   144  	BytomcliCmd.AddCommand(estimateTransactionGasCmd)
   145  
   146  	BytomcliCmd.AddCommand(getBlockCountCmd)
   147  	BytomcliCmd.AddCommand(getBlockHashCmd)
   148  	BytomcliCmd.AddCommand(getBlockCmd)
   149  	BytomcliCmd.AddCommand(getBlockHeaderCmd)
   150  	BytomcliCmd.AddCommand(getDifficultyCmd)
   151  	BytomcliCmd.AddCommand(getHashRateCmd)
   152  
   153  	BytomcliCmd.AddCommand(createKeyCmd)
   154  	BytomcliCmd.AddCommand(deleteKeyCmd)
   155  	BytomcliCmd.AddCommand(listKeysCmd)
   156  	BytomcliCmd.AddCommand(updateKeyAliasCmd)
   157  	BytomcliCmd.AddCommand(resetKeyPwdCmd)
   158  	BytomcliCmd.AddCommand(checkKeyPwdCmd)
   159  
   160  	BytomcliCmd.AddCommand(signMsgCmd)
   161  	BytomcliCmd.AddCommand(verifyMsgCmd)
   162  	BytomcliCmd.AddCommand(decodeProgCmd)
   163  
   164  	BytomcliCmd.AddCommand(createTransactionFeedCmd)
   165  	BytomcliCmd.AddCommand(listTransactionFeedsCmd)
   166  	BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
   167  	BytomcliCmd.AddCommand(getTransactionFeedCmd)
   168  	BytomcliCmd.AddCommand(updateTransactionFeedCmd)
   169  
   170  	BytomcliCmd.AddCommand(isMiningCmd)
   171  	BytomcliCmd.AddCommand(setMiningCmd)
   172  
   173  	BytomcliCmd.AddCommand(netInfoCmd)
   174  	BytomcliCmd.AddCommand(gasRateCmd)
   175  
   176  	BytomcliCmd.AddCommand(versionCmd)
   177  }
   178  
   179  // AddTemplateFunc adds usage template to the root command BytomcliCmd.
   180  func AddTemplateFunc() {
   181  	walletEnableCmd := []string{
   182  		createAccountCmd.Name(),
   183  		listAccountsCmd.Name(),
   184  		deleteAccountCmd.Name(),
   185  		updateAccountAliasCmd.Name(),
   186  		createAccountReceiverCmd.Name(),
   187  		listAddressesCmd.Name(),
   188  		validateAddressCmd.Name(),
   189  		listPubKeysCmd.Name(),
   190  
   191  		createAssetCmd.Name(),
   192  		getAssetCmd.Name(),
   193  		listAssetsCmd.Name(),
   194  		updateAssetAliasCmd.Name(),
   195  
   196  		createKeyCmd.Name(),
   197  		deleteKeyCmd.Name(),
   198  		listKeysCmd.Name(),
   199  		resetKeyPwdCmd.Name(),
   200  		checkKeyPwdCmd.Name(),
   201  		signMsgCmd.Name(),
   202  
   203  		buildTransactionCmd.Name(),
   204  		signTransactionCmd.Name(),
   205  
   206  		getTransactionCmd.Name(),
   207  		listTransactionsCmd.Name(),
   208  		listUnspentOutputsCmd.Name(),
   209  		listBalancesCmd.Name(),
   210  
   211  		rescanWalletCmd.Name(),
   212  		walletInfoCmd.Name(),
   213  	}
   214  
   215  	cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
   216  		for _, name := range walletEnableCmd {
   217  			if name == cmdName {
   218  				return true
   219  			}
   220  		}
   221  		return false
   222  	})
   223  
   224  	cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
   225  		for _, name := range walletEnableCmd {
   226  			if name == cmdName {
   227  				return false
   228  			}
   229  		}
   230  		return true
   231  	})
   232  }