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)
120 BytomcliCmd.AddCommand(listPubKeysCmd)
122 BytomcliCmd.AddCommand(createAssetCmd)
123 BytomcliCmd.AddCommand(getAssetCmd)
124 BytomcliCmd.AddCommand(listAssetsCmd)
125 BytomcliCmd.AddCommand(updateAssetAliasCmd)
127 BytomcliCmd.AddCommand(getTransactionCmd)
128 BytomcliCmd.AddCommand(listTransactionsCmd)
130 BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
131 BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
132 BytomcliCmd.AddCommand(decodeRawTransactionCmd)
134 BytomcliCmd.AddCommand(listUnspentOutputsCmd)
135 BytomcliCmd.AddCommand(listBalancesCmd)
137 BytomcliCmd.AddCommand(buildTransactionCmd)
138 BytomcliCmd.AddCommand(signTransactionCmd)
139 BytomcliCmd.AddCommand(submitTransactionCmd)
140 BytomcliCmd.AddCommand(estimateTransactionGasCmd)
142 BytomcliCmd.AddCommand(getBlockCountCmd)
143 BytomcliCmd.AddCommand(getBlockHashCmd)
144 BytomcliCmd.AddCommand(getBlockCmd)
145 BytomcliCmd.AddCommand(getBlockHeaderCmd)
146 BytomcliCmd.AddCommand(getDifficultyCmd)
147 BytomcliCmd.AddCommand(getHashRateCmd)
149 BytomcliCmd.AddCommand(createKeyCmd)
150 BytomcliCmd.AddCommand(deleteKeyCmd)
151 BytomcliCmd.AddCommand(listKeysCmd)
152 BytomcliCmd.AddCommand(resetKeyPwdCmd)
154 BytomcliCmd.AddCommand(signMsgCmd)
155 BytomcliCmd.AddCommand(verifyMsgCmd)
156 BytomcliCmd.AddCommand(decodeProgCmd)
158 BytomcliCmd.AddCommand(createTransactionFeedCmd)
159 BytomcliCmd.AddCommand(listTransactionFeedsCmd)
160 BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
161 BytomcliCmd.AddCommand(getTransactionFeedCmd)
162 BytomcliCmd.AddCommand(updateTransactionFeedCmd)
164 BytomcliCmd.AddCommand(isMiningCmd)
165 BytomcliCmd.AddCommand(setMiningCmd)
167 BytomcliCmd.AddCommand(netInfoCmd)
168 BytomcliCmd.AddCommand(gasRateCmd)
170 BytomcliCmd.AddCommand(versionCmd)
173 // AddTemplateFunc adds usage template to the root command BytomcliCmd.
174 func AddTemplateFunc() {
175 walletEnableCmd := []string{
176 createAccountCmd.Name(),
177 listAccountsCmd.Name(),
178 deleteAccountCmd.Name(),
179 createAccountReceiverCmd.Name(),
180 listAddressesCmd.Name(),
181 validateAddressCmd.Name(),
182 listPubKeysCmd.Name(),
184 createAssetCmd.Name(),
186 listAssetsCmd.Name(),
187 updateAssetAliasCmd.Name(),
192 resetKeyPwdCmd.Name(),
195 buildTransactionCmd.Name(),
196 signTransactionCmd.Name(),
198 getTransactionCmd.Name(),
199 listTransactionsCmd.Name(),
200 listUnspentOutputsCmd.Name(),
201 listBalancesCmd.Name(),
204 cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
205 for _, name := range walletEnableCmd {
213 cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
214 for _, name := range walletEnableCmd {