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 }