OSDN Git Service

add list-pubkeys API (#1086)
[bytom/bytom-spv.git] / cmd / bytomcli / commands / bytomcli.go
1 package commands
2
3 import (
4         "fmt"
5         "os"
6         "regexp"
7
8         "github.com/spf13/cobra"
9
10         "github.com/bytom/util"
11 )
12
13 // bytomcli usage template
14 var usageTemplate = `Usage:{{if .Runnable}}
15   {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
16   {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
17
18 Aliases:
19   {{.NameAndAliases}}{{end}}{{if .HasExample}}
20
21 Examples:
22 {{.Example}}{{end}}{{if .HasAvailableSubCommands}}
23
24 Available Commands:
25     {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletDisable))}}
26     {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}
27
28   available with wallet enable:
29     {{range .Commands}}{{if (and .IsAvailableCommand (.Name | WalletEnable))}}
30     {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
31
32 Flags:
33 {{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
34
35 Global Flags:
36 {{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
37
38 Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
39   {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
40
41 Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}}
42 `
43
44 // commandError is an error used to signal different error situations in command handling.
45 type commandError struct {
46         s         string
47         userError bool
48 }
49
50 func (c commandError) Error() string {
51         return c.s
52 }
53
54 func (c commandError) isUserError() bool {
55         return c.userError
56 }
57
58 func newUserError(a ...interface{}) commandError {
59         return commandError{s: fmt.Sprintln(a...), userError: true}
60 }
61
62 func newSystemError(a ...interface{}) commandError {
63         return commandError{s: fmt.Sprintln(a...), userError: false}
64 }
65
66 func newSystemErrorF(format string, a ...interface{}) commandError {
67         return commandError{s: fmt.Sprintf(format, a...), userError: false}
68 }
69
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")
74
75 func isUserError(err error) bool {
76         if cErr, ok := err.(commandError); ok && cErr.isUserError() {
77                 return true
78         }
79
80         return userErrorRegexp.MatchString(err.Error())
81 }
82
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{
86         Use:   "bytomcli",
87         Short: "Bytomcli is a commond line client for bytom core (a.k.a. bytomd)",
88         Run: func(cmd *cobra.Command, args []string) {
89                 if len(args) < 1 {
90                         cmd.SetUsageTemplate(usageTemplate)
91                         cmd.Usage()
92                 }
93         },
94 }
95
96 // Execute adds all child commands to the root command BytomcliCmd and sets flags appropriately.
97 func Execute() {
98
99         AddCommands()
100         AddTemplateFunc()
101
102         if _, err := BytomcliCmd.ExecuteC(); err != nil {
103                 os.Exit(util.ErrLocalExe)
104         }
105 }
106
107 // AddCommands adds child commands to the root command BytomcliCmd.
108 func AddCommands() {
109         BytomcliCmd.AddCommand(createAccessTokenCmd)
110         BytomcliCmd.AddCommand(listAccessTokenCmd)
111         BytomcliCmd.AddCommand(deleteAccessTokenCmd)
112         BytomcliCmd.AddCommand(checkAccessTokenCmd)
113
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)
121
122         BytomcliCmd.AddCommand(createAssetCmd)
123         BytomcliCmd.AddCommand(getAssetCmd)
124         BytomcliCmd.AddCommand(listAssetsCmd)
125         BytomcliCmd.AddCommand(updateAssetAliasCmd)
126
127         BytomcliCmd.AddCommand(getTransactionCmd)
128         BytomcliCmd.AddCommand(listTransactionsCmd)
129
130         BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
131         BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
132         BytomcliCmd.AddCommand(decodeRawTransactionCmd)
133
134         BytomcliCmd.AddCommand(listUnspentOutputsCmd)
135         BytomcliCmd.AddCommand(listBalancesCmd)
136
137         BytomcliCmd.AddCommand(buildTransactionCmd)
138         BytomcliCmd.AddCommand(signTransactionCmd)
139         BytomcliCmd.AddCommand(submitTransactionCmd)
140         BytomcliCmd.AddCommand(estimateTransactionGasCmd)
141
142         BytomcliCmd.AddCommand(getBlockCountCmd)
143         BytomcliCmd.AddCommand(getBlockHashCmd)
144         BytomcliCmd.AddCommand(getBlockCmd)
145         BytomcliCmd.AddCommand(getBlockHeaderCmd)
146         BytomcliCmd.AddCommand(getDifficultyCmd)
147         BytomcliCmd.AddCommand(getHashRateCmd)
148
149         BytomcliCmd.AddCommand(createKeyCmd)
150         BytomcliCmd.AddCommand(deleteKeyCmd)
151         BytomcliCmd.AddCommand(listKeysCmd)
152         BytomcliCmd.AddCommand(resetKeyPwdCmd)
153
154         BytomcliCmd.AddCommand(signMsgCmd)
155         BytomcliCmd.AddCommand(verifyMsgCmd)
156         BytomcliCmd.AddCommand(decodeProgCmd)
157
158         BytomcliCmd.AddCommand(createTransactionFeedCmd)
159         BytomcliCmd.AddCommand(listTransactionFeedsCmd)
160         BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
161         BytomcliCmd.AddCommand(getTransactionFeedCmd)
162         BytomcliCmd.AddCommand(updateTransactionFeedCmd)
163
164         BytomcliCmd.AddCommand(isMiningCmd)
165         BytomcliCmd.AddCommand(setMiningCmd)
166
167         BytomcliCmd.AddCommand(netInfoCmd)
168         BytomcliCmd.AddCommand(gasRateCmd)
169
170         BytomcliCmd.AddCommand(versionCmd)
171 }
172
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(),
183
184                 createAssetCmd.Name(),
185                 getAssetCmd.Name(),
186                 listAssetsCmd.Name(),
187                 updateAssetAliasCmd.Name(),
188
189                 createKeyCmd.Name(),
190                 deleteKeyCmd.Name(),
191                 listKeysCmd.Name(),
192                 resetKeyPwdCmd.Name(),
193                 signMsgCmd.Name(),
194
195                 buildTransactionCmd.Name(),
196                 signTransactionCmd.Name(),
197
198                 getTransactionCmd.Name(),
199                 listTransactionsCmd.Name(),
200                 listUnspentOutputsCmd.Name(),
201                 listBalancesCmd.Name(),
202         }
203
204         cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
205                 for _, name := range walletEnableCmd {
206                         if name == cmdName {
207                                 return true
208                         }
209                 }
210                 return false
211         })
212
213         cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
214                 for _, name := range walletEnableCmd {
215                         if name == cmdName {
216                                 return false
217                         }
218                 }
219                 return true
220         })
221 }