8 "github.com/spf13/cobra"
10 "github.com/bytom/util"
13 // bytomcli usage template
14 var usageTemplate = `Usage:{{if .Runnable}}
15 {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
16 {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
19 {{.NameAndAliases}}{{end}}{{if .HasExample}}
22 {{.Example}}{{end}}{{if .HasAvailableSubCommands}}
25 {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletDisable))}}
26 {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}
28 available with wallet enable:
29 {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletEnable))}}
30 {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
33 {{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
36 {{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
38 Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
39 {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
41 Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}}
44 // commandError is an error used to signal different error situations in command handling.
45 type commandError struct {
50 func (c commandError) Error() string {
54 func (c commandError) isUserError() bool {
58 func newUserError(a ...interface{}) commandError {
59 return commandError{s: fmt.Sprintln(a...), userError: true}
62 func newSystemError(a ...interface{}) commandError {
63 return commandError{s: fmt.Sprintln(a...), userError: false}
66 func newSystemErrorF(format string, a ...interface{}) commandError {
67 return commandError{s: fmt.Sprintf(format, a...), userError: false}
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")
75 func isUserError(err error) bool {
76 if cErr, ok := err.(commandError); ok && cErr.isUserError() {
80 return userErrorRegexp.MatchString(err.Error())
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{
87 Short: "Bytomcli is a commond line client for bytom core (a.k.a. bytomd)",
88 Run: func(cmd *cobra.Command, args []string) {
90 cmd.SetUsageTemplate(usageTemplate)
96 // Execute adds all child commands to the root command BytomcliCmd and sets flags appropriately.
102 if _, err := BytomcliCmd.ExecuteC(); err != nil {
103 os.Exit(util.ErrLocalExe)
107 // AddCommands adds child commands to the root command BytomcliCmd.
109 BytomcliCmd.AddCommand(createAccessTokenCmd)
110 BytomcliCmd.AddCommand(listAccessTokenCmd)
111 BytomcliCmd.AddCommand(deleteAccessTokenCmd)
112 BytomcliCmd.AddCommand(checkAccessTokenCmd)
114 BytomcliCmd.AddCommand(createAccountCmd)
115 BytomcliCmd.AddCommand(deleteAccountCmd)
116 BytomcliCmd.AddCommand(listAccountsCmd)
117 BytomcliCmd.AddCommand(createAccountReceiverCmd)
118 BytomcliCmd.AddCommand(listAddressesCmd)
119 BytomcliCmd.AddCommand(validateAddressCmd)
121 BytomcliCmd.AddCommand(createAssetCmd)
122 BytomcliCmd.AddCommand(getAssetCmd)
123 BytomcliCmd.AddCommand(listAssetsCmd)
124 BytomcliCmd.AddCommand(updateAssetAliasCmd)
126 BytomcliCmd.AddCommand(getTransactionCmd)
127 BytomcliCmd.AddCommand(listTransactionsCmd)
129 BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
130 BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
132 BytomcliCmd.AddCommand(getMemPoolTransactionCmd)
133 BytomcliCmd.AddCommand(listMemPoolTransactionsCmd)
134 BytomcliCmd.AddCommand(decodeRawTransactionCmd)
136 BytomcliCmd.AddCommand(listUnspentOutputsCmd)
137 BytomcliCmd.AddCommand(listBalancesCmd)
139 BytomcliCmd.AddCommand(buildTransactionCmd)
140 BytomcliCmd.AddCommand(signTransactionCmd)
141 BytomcliCmd.AddCommand(submitTransactionCmd)
142 BytomcliCmd.AddCommand(estimateTransactionGasCmd)
144 BytomcliCmd.AddCommand(getBlockCountCmd)
145 BytomcliCmd.AddCommand(getBlockHashCmd)
146 BytomcliCmd.AddCommand(getBlockCmd)
147 BytomcliCmd.AddCommand(getBlockHeaderCmd)
148 BytomcliCmd.AddCommand(getDifficultyCmd)
149 BytomcliCmd.AddCommand(getHashRateCmd)
151 BytomcliCmd.AddCommand(createKeyCmd)
152 BytomcliCmd.AddCommand(deleteKeyCmd)
153 BytomcliCmd.AddCommand(listKeysCmd)
154 BytomcliCmd.AddCommand(resetKeyPwdCmd)
156 BytomcliCmd.AddCommand(signMsgCmd)
157 BytomcliCmd.AddCommand(verifyMsgCmd)
158 BytomcliCmd.AddCommand(decodeProgCmd)
160 BytomcliCmd.AddCommand(createTransactionFeedCmd)
161 BytomcliCmd.AddCommand(listTransactionFeedsCmd)
162 BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
163 BytomcliCmd.AddCommand(getTransactionFeedCmd)
164 BytomcliCmd.AddCommand(updateTransactionFeedCmd)
166 BytomcliCmd.AddCommand(isMiningCmd)
167 BytomcliCmd.AddCommand(setMiningCmd)
169 BytomcliCmd.AddCommand(netInfoCmd)
170 BytomcliCmd.AddCommand(gasRateCmd)
172 BytomcliCmd.AddCommand(versionCmd)
175 // AddTemplateFunc adds usage template to the root command BytomcliCmd.
176 func AddTemplateFunc() {
177 walletEnableCmd := []string{
178 createAccountCmd.Name(),
179 listAccountsCmd.Name(),
180 deleteAccountCmd.Name(),
181 createAccountReceiverCmd.Name(),
182 listAddressesCmd.Name(),
183 validateAddressCmd.Name(),
185 createAssetCmd.Name(),
187 listAssetsCmd.Name(),
188 updateAssetAliasCmd.Name(),
193 resetKeyPwdCmd.Name(),
196 buildTransactionCmd.Name(),
197 signTransactionCmd.Name(),
199 getTransactionCmd.Name(),
200 listTransactionsCmd.Name(),
201 listUnspentOutputsCmd.Name(),
202 listBalancesCmd.Name(),
205 cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
206 for _, name := range walletEnableCmd {
214 cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
215 for _, name := range walletEnableCmd {