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(listUnspentOutputsCmd)
133 BytomcliCmd.AddCommand(listBalancesCmd)
135 BytomcliCmd.AddCommand(buildTransactionCmd)
136 BytomcliCmd.AddCommand(signTransactionCmd)
137 BytomcliCmd.AddCommand(submitTransactionCmd)
138 BytomcliCmd.AddCommand(estimateTransactionGasCmd)
140 BytomcliCmd.AddCommand(getBlockCountCmd)
141 BytomcliCmd.AddCommand(getBlockHashCmd)
142 BytomcliCmd.AddCommand(getBlockCmd)
143 BytomcliCmd.AddCommand(getBlockHeaderCmd)
145 BytomcliCmd.AddCommand(createKeyCmd)
146 BytomcliCmd.AddCommand(deleteKeyCmd)
147 BytomcliCmd.AddCommand(listKeysCmd)
148 BytomcliCmd.AddCommand(resetKeyPwdCmd)
150 BytomcliCmd.AddCommand(createTransactionFeedCmd)
151 BytomcliCmd.AddCommand(listTransactionFeedsCmd)
152 BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
153 BytomcliCmd.AddCommand(getTransactionFeedCmd)
154 BytomcliCmd.AddCommand(updateTransactionFeedCmd)
156 BytomcliCmd.AddCommand(isMiningCmd)
157 BytomcliCmd.AddCommand(setMiningCmd)
159 BytomcliCmd.AddCommand(netInfoCmd)
160 BytomcliCmd.AddCommand(gasRateCmd)
162 BytomcliCmd.AddCommand(versionCmd)
165 // AddTemplateFunc adds usage template to the root command BytomcliCmd.
166 func AddTemplateFunc() {
167 walletEnableCmd := []string{
168 createAccountCmd.Name(),
169 listAccountsCmd.Name(),
170 deleteAccountCmd.Name(),
171 createAccountReceiverCmd.Name(),
172 listAddressesCmd.Name(),
173 validateAddressCmd.Name(),
175 createAssetCmd.Name(),
177 listAssetsCmd.Name(),
178 updateAssetAliasCmd.Name(),
183 resetKeyPwdCmd.Name(),
185 buildTransactionCmd.Name(),
186 signTransactionCmd.Name(),
187 submitTransactionCmd.Name(),
188 estimateTransactionGasCmd.Name(),
190 getTransactionCmd.Name(),
191 listTransactionsCmd.Name(),
192 listUnspentOutputsCmd.Name(),
193 listBalancesCmd.Name(),
196 cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
197 for _, name := range walletEnableCmd {
205 cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
206 for _, name := range walletEnableCmd {