OSDN Git Service

Merge pull request #845 from Bytom/fix_pex_exchane
[bytom/bytom.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
121         BytomcliCmd.AddCommand(createAssetCmd)
122         BytomcliCmd.AddCommand(getAssetCmd)
123         BytomcliCmd.AddCommand(listAssetsCmd)
124         BytomcliCmd.AddCommand(updateAssetAliasCmd)
125
126         BytomcliCmd.AddCommand(getTransactionCmd)
127         BytomcliCmd.AddCommand(listTransactionsCmd)
128
129         BytomcliCmd.AddCommand(getUnconfirmedTransactionCmd)
130         BytomcliCmd.AddCommand(listUnconfirmedTransactionsCmd)
131
132         BytomcliCmd.AddCommand(listUnspentOutputsCmd)
133         BytomcliCmd.AddCommand(listBalancesCmd)
134
135         BytomcliCmd.AddCommand(buildTransactionCmd)
136         BytomcliCmd.AddCommand(signTransactionCmd)
137         BytomcliCmd.AddCommand(submitTransactionCmd)
138         BytomcliCmd.AddCommand(estimateTransactionGasCmd)
139
140         BytomcliCmd.AddCommand(getBlockCountCmd)
141         BytomcliCmd.AddCommand(getBlockHashCmd)
142         BytomcliCmd.AddCommand(getBlockCmd)
143         BytomcliCmd.AddCommand(getBlockHeaderCmd)
144         BytomcliCmd.AddCommand(getDifficultyCmd)
145         BytomcliCmd.AddCommand(getHashRateCmd)
146
147         BytomcliCmd.AddCommand(createKeyCmd)
148         BytomcliCmd.AddCommand(deleteKeyCmd)
149         BytomcliCmd.AddCommand(listKeysCmd)
150         BytomcliCmd.AddCommand(resetKeyPwdCmd)
151
152         BytomcliCmd.AddCommand(createTransactionFeedCmd)
153         BytomcliCmd.AddCommand(listTransactionFeedsCmd)
154         BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
155         BytomcliCmd.AddCommand(getTransactionFeedCmd)
156         BytomcliCmd.AddCommand(updateTransactionFeedCmd)
157
158         BytomcliCmd.AddCommand(isMiningCmd)
159         BytomcliCmd.AddCommand(setMiningCmd)
160
161         BytomcliCmd.AddCommand(netInfoCmd)
162         BytomcliCmd.AddCommand(gasRateCmd)
163
164         BytomcliCmd.AddCommand(versionCmd)
165 }
166
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(),
176
177                 createAssetCmd.Name(),
178                 getAssetCmd.Name(),
179                 listAssetsCmd.Name(),
180                 updateAssetAliasCmd.Name(),
181
182                 createKeyCmd.Name(),
183                 deleteKeyCmd.Name(),
184                 listKeysCmd.Name(),
185                 resetKeyPwdCmd.Name(),
186
187                 buildTransactionCmd.Name(),
188                 signTransactionCmd.Name(),
189                 submitTransactionCmd.Name(),
190                 estimateTransactionGasCmd.Name(),
191
192                 getTransactionCmd.Name(),
193                 listTransactionsCmd.Name(),
194                 listUnspentOutputsCmd.Name(),
195                 listBalancesCmd.Name(),
196         }
197
198         cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
199                 for _, name := range walletEnableCmd {
200                         if name == cmdName {
201                                 return true
202                         }
203                 }
204                 return false
205         })
206
207         cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
208                 for _, name := range walletEnableCmd {
209                         if name == cmdName {
210                                 return false
211                         }
212                 }
213                 return true
214         })
215 }