8 "github.com/spf13/cobra"
10 "github.com/vapor/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(updateAccountAliasCmd)
118 BytomcliCmd.AddCommand(createAccountReceiverCmd)
119 BytomcliCmd.AddCommand(listAddressesCmd)
120 BytomcliCmd.AddCommand(validateAddressCmd)
121 BytomcliCmd.AddCommand(listPubKeysCmd)
123 BytomcliCmd.AddCommand(createAssetCmd)
124 BytomcliCmd.AddCommand(getAssetCmd)
125 BytomcliCmd.AddCommand(listAssetsCmd)
126 BytomcliCmd.AddCommand(updateAssetAliasCmd)
128 BytomcliCmd.AddCommand(getTransactionCmd)
129 BytomcliCmd.AddCommand(listTransactionsCmd)
131 BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
132 BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
133 BytomcliCmd.AddCommand(decodeRawTransactionCmd)
135 BytomcliCmd.AddCommand(listUnspentOutputsCmd)
136 BytomcliCmd.AddCommand(listBalancesCmd)
138 BytomcliCmd.AddCommand(rescanWalletCmd)
139 BytomcliCmd.AddCommand(walletInfoCmd)
141 BytomcliCmd.AddCommand(buildTransactionCmd)
142 BytomcliCmd.AddCommand(signTransactionCmd)
143 BytomcliCmd.AddCommand(submitTransactionCmd)
144 BytomcliCmd.AddCommand(estimateTransactionGasCmd)
146 BytomcliCmd.AddCommand(getBlockCountCmd)
147 BytomcliCmd.AddCommand(getBlockHashCmd)
148 BytomcliCmd.AddCommand(getBlockCmd)
149 BytomcliCmd.AddCommand(getBlockHeaderCmd)
150 BytomcliCmd.AddCommand(getDifficultyCmd)
151 BytomcliCmd.AddCommand(getHashRateCmd)
153 BytomcliCmd.AddCommand(createKeyCmd)
154 BytomcliCmd.AddCommand(deleteKeyCmd)
155 BytomcliCmd.AddCommand(listKeysCmd)
156 BytomcliCmd.AddCommand(updateKeyAliasCmd)
157 BytomcliCmd.AddCommand(resetKeyPwdCmd)
158 BytomcliCmd.AddCommand(checkKeyPwdCmd)
160 BytomcliCmd.AddCommand(signMsgCmd)
161 BytomcliCmd.AddCommand(verifyMsgCmd)
162 BytomcliCmd.AddCommand(decodeProgCmd)
164 BytomcliCmd.AddCommand(createTransactionFeedCmd)
165 BytomcliCmd.AddCommand(listTransactionFeedsCmd)
166 BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
167 BytomcliCmd.AddCommand(getTransactionFeedCmd)
168 BytomcliCmd.AddCommand(updateTransactionFeedCmd)
170 BytomcliCmd.AddCommand(isMiningCmd)
171 BytomcliCmd.AddCommand(setMiningCmd)
173 BytomcliCmd.AddCommand(netInfoCmd)
174 BytomcliCmd.AddCommand(gasRateCmd)
176 BytomcliCmd.AddCommand(versionCmd)
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(),
191 createAssetCmd.Name(),
193 listAssetsCmd.Name(),
194 updateAssetAliasCmd.Name(),
199 resetKeyPwdCmd.Name(),
200 checkKeyPwdCmd.Name(),
203 buildTransactionCmd.Name(),
204 signTransactionCmd.Name(),
206 getTransactionCmd.Name(),
207 listTransactionsCmd.Name(),
208 listUnspentOutputsCmd.Name(),
209 listBalancesCmd.Name(),
211 rescanWalletCmd.Name(),
212 walletInfoCmd.Name(),
215 cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
216 for _, name := range walletEnableCmd {
224 cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
225 for _, name := range walletEnableCmd {