OSDN Git Service

add txCh for synmanager
[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(getMemPoolTransactionCmd)
133         BytomcliCmd.AddCommand(listMemPoolTransactionsCmd)
134         BytomcliCmd.AddCommand(decodeRawTransactionCmd)
135
136         BytomcliCmd.AddCommand(listUnspentOutputsCmd)
137         BytomcliCmd.AddCommand(listBalancesCmd)
138
139         BytomcliCmd.AddCommand(buildTransactionCmd)
140         BytomcliCmd.AddCommand(signTransactionCmd)
141         BytomcliCmd.AddCommand(submitTransactionCmd)
142         BytomcliCmd.AddCommand(estimateTransactionGasCmd)
143
144         BytomcliCmd.AddCommand(getBlockCountCmd)
145         BytomcliCmd.AddCommand(getBlockHashCmd)
146         BytomcliCmd.AddCommand(getBlockCmd)
147         BytomcliCmd.AddCommand(getBlockHeaderCmd)
148         BytomcliCmd.AddCommand(getDifficultyCmd)
149         BytomcliCmd.AddCommand(getHashRateCmd)
150
151         BytomcliCmd.AddCommand(createKeyCmd)
152         BytomcliCmd.AddCommand(deleteKeyCmd)
153         BytomcliCmd.AddCommand(listKeysCmd)
154         BytomcliCmd.AddCommand(resetKeyPwdCmd)
155
156         BytomcliCmd.AddCommand(signMsgCmd)
157         BytomcliCmd.AddCommand(verifyMsgCmd)
158         BytomcliCmd.AddCommand(decodeProgCmd)
159
160         BytomcliCmd.AddCommand(createTransactionFeedCmd)
161         BytomcliCmd.AddCommand(listTransactionFeedsCmd)
162         BytomcliCmd.AddCommand(deleteTransactionFeedCmd)
163         BytomcliCmd.AddCommand(getTransactionFeedCmd)
164         BytomcliCmd.AddCommand(updateTransactionFeedCmd)
165
166         BytomcliCmd.AddCommand(isMiningCmd)
167         BytomcliCmd.AddCommand(setMiningCmd)
168
169         BytomcliCmd.AddCommand(netInfoCmd)
170         BytomcliCmd.AddCommand(gasRateCmd)
171
172         BytomcliCmd.AddCommand(versionCmd)
173 }
174
175 // AddTemplateFunc adds usage template to the root command BytomcliCmd.
176 func AddTemplateFunc() {
177         walletEnableCmd := []string{
178                 createAccountCmd.Name(),
179                 listAccountsCmd.Name(),
180                 deleteAccountCmd.Name(),
181                 createAccountReceiverCmd.Name(),
182                 listAddressesCmd.Name(),
183                 validateAddressCmd.Name(),
184
185                 createAssetCmd.Name(),
186                 getAssetCmd.Name(),
187                 listAssetsCmd.Name(),
188                 updateAssetAliasCmd.Name(),
189
190                 createKeyCmd.Name(),
191                 deleteKeyCmd.Name(),
192                 listKeysCmd.Name(),
193                 resetKeyPwdCmd.Name(),
194                 signMsgCmd.Name(),
195
196                 buildTransactionCmd.Name(),
197                 signTransactionCmd.Name(),
198
199                 getTransactionCmd.Name(),
200                 listTransactionsCmd.Name(),
201                 listUnspentOutputsCmd.Name(),
202                 listBalancesCmd.Name(),
203         }
204
205         cobra.AddTemplateFunc("WalletEnable", func(cmdName string) bool {
206                 for _, name := range walletEnableCmd {
207                         if name == cmdName {
208                                 return true
209                         }
210                 }
211                 return false
212         })
213
214         cobra.AddTemplateFunc("WalletDisable", func(cmdName string) bool {
215                 for _, name := range walletEnableCmd {
216                         if name == cmdName {
217                                 return false
218                         }
219                 }
220                 return true
221         })
222 }