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)
144 BytomcliCmd.AddCommand(getDifficultyCmd)
145 BytomcliCmd.AddCommand(getHashRateCmd)
147 BytomcliCmd.AddCommand(createKeyCmd)
148 BytomcliCmd.AddCommand(deleteKeyCmd)
149 BytomcliCmd.AddCommand(listKeysCmd)
150 BytomcliCmd.AddCommand(resetKeyPwdCmd)
152 BytomcliCmd.AddCommand(createTransactionFeedCmd)
153 BytomcliCmd.AddCommand(listTransactionFeedsCmd)
154 BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
155 BytomcliCmd.AddCommand(getTransactionFeedCmd)
156 BytomcliCmd.AddCommand(updateTransactionFeedCmd)
158 BytomcliCmd.AddCommand(isMiningCmd)
159 BytomcliCmd.AddCommand(setMiningCmd)
161 BytomcliCmd.AddCommand(netInfoCmd)
162 BytomcliCmd.AddCommand(gasRateCmd)
164 BytomcliCmd.AddCommand(versionCmd)
167 // AddTemplateFunc adds usage template to the root command BytomcliCmd.
168 func AddTemplateFunc() {
169 walletEnableCmd := []string{
170 createAccountCmd.Name(),
171 listAccountsCmd.Name(),
172 deleteAccountCmd.Name(),
173 createAccountReceiverCmd.Name(),
174 listAddressesCmd.Name(),
175 validateAddressCmd.Name(),
177 createAssetCmd.Name(),
179 listAssetsCmd.Name(),
180 updateAssetAliasCmd.Name(),
185 resetKeyPwdCmd.Name(),
187 buildTransactionCmd.Name(),
188 signTransactionCmd.Name(),
189 submitTransactionCmd.Name(),
190 estimateTransactionGasCmd.Name(),
192 getTransactionCmd.Name(),
193 listTransactionsCmd.Name(),
194 listUnspentOutputsCmd.Name(),
195 listBalancesCmd.Name(),
198 cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
199 for _, name := range walletEnableCmd {
207 cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
208 for _, name := range walletEnableCmd {