github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/cmd/sipe/usage.go (about) 1 package main 2 3 import ( 4 "io" 5 "sort" 6 7 "github.com/bigzoro/my_simplechain/cmd/utils" 8 "github.com/bigzoro/my_simplechain/internal/debug" 9 cli "gopkg.in/urfave/cli.v1" 10 ) 11 12 // AppHelpTemplate is the test template for the default, global app help topic. 13 var AppHelpTemplate = `NAME: 14 {{.App.Name}} - {{.App.Usage}} 15 16 Copyright 2013-2019 The go-simplechain Authors 17 18 USAGE: 19 {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} 20 {{if .App.Version}} 21 VERSION: 22 {{.App.Version}} 23 {{end}}{{if len .App.Authors}} 24 AUTHOR(S): 25 {{range .App.Authors}}{{ . }}{{end}} 26 {{end}}{{if .App.Commands}} 27 COMMANDS: 28 {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} 29 {{end}}{{end}}{{if .FlagGroups}} 30 {{range .FlagGroups}}{{.Name}} OPTIONS: 31 {{range .Flags}}{{.}} 32 {{end}} 33 {{end}}{{end}}{{if .App.Copyright }} 34 COPYRIGHT: 35 {{.App.Copyright}} 36 {{end}} 37 ` 38 39 // flagGroup is a collection of flags belonging to a single topic. 40 type flagGroup struct { 41 Name string 42 Flags []cli.Flag 43 } 44 45 // AppHelpFlagGroups is the application flags, grouped by functionality. 46 var AppHelpFlagGroups = []flagGroup{ 47 { 48 Name: "ETHEREUM", 49 Flags: []cli.Flag{ 50 configFileFlag, 51 utils.DataDirFlag, 52 utils.AncientFlag, 53 utils.KeyStoreDirFlag, 54 utils.NoUSBFlag, 55 utils.SmartCardDaemonPathFlag, 56 utils.NetworkIdFlag, 57 utils.TestnetFlag, 58 utils.SyncModeFlag, 59 utils.ExitWhenSyncedFlag, 60 utils.GCModeFlag, 61 utils.EthStatsURLFlag, 62 utils.IdentityFlag, 63 utils.LightKDFFlag, 64 utils.WhitelistFlag, 65 }, 66 }, 67 { 68 Name: "LIGHT CLIENT", 69 Flags: []cli.Flag{ 70 utils.LightServeFlag, 71 utils.LightIngressFlag, 72 utils.LightEgressFlag, 73 utils.LightMaxPeersFlag, 74 utils.UltraLightServersFlag, 75 utils.UltraLightFractionFlag, 76 utils.UltraLightOnlyAnnounceFlag, 77 }, 78 }, 79 { 80 Name: "DEVELOPER CHAIN", 81 Flags: []cli.Flag{ 82 utils.DeveloperFlag, 83 utils.DeveloperPeriodFlag, 84 }, 85 }, 86 { 87 Name: "ETHASH", 88 Flags: []cli.Flag{ 89 utils.EthashCacheDirFlag, 90 utils.EthashCachesInMemoryFlag, 91 utils.EthashCachesOnDiskFlag, 92 utils.EthashDatasetDirFlag, 93 utils.EthashDatasetsInMemoryFlag, 94 utils.EthashDatasetsOnDiskFlag, 95 }, 96 }, 97 { 98 Name: "TRANSACTION POOL", 99 Flags: []cli.Flag{ 100 utils.TxPoolLocalsFlag, 101 utils.TxPoolNoLocalsFlag, 102 utils.TxPoolJournalFlag, 103 utils.TxPoolRejournalFlag, 104 utils.TxPoolPriceLimitFlag, 105 utils.TxPoolPriceBumpFlag, 106 utils.TxPoolAccountSlotsFlag, 107 utils.TxPoolGlobalSlotsFlag, 108 utils.TxPoolAccountQueueFlag, 109 utils.TxPoolGlobalQueueFlag, 110 utils.TxPoolLifetimeFlag, 111 }, 112 }, 113 { 114 Name: "PERFORMANCE TUNING", 115 Flags: []cli.Flag{ 116 utils.CacheFlag, 117 utils.CacheDatabaseFlag, 118 utils.CacheTrieFlag, 119 utils.CacheGCFlag, 120 utils.CacheNoPrefetchFlag, 121 }, 122 }, 123 { 124 Name: "ACCOUNT", 125 Flags: []cli.Flag{ 126 utils.UnlockedAccountFlag, 127 utils.PasswordFileFlag, 128 utils.ExternalSignerFlag, 129 utils.InsecureUnlockAllowedFlag, 130 }, 131 }, 132 { 133 Name: "API AND CONSOLE", 134 Flags: []cli.Flag{ 135 utils.IPCDisabledFlag, 136 utils.IPCPathFlag, 137 utils.RPCEnabledFlag, 138 utils.RPCListenAddrFlag, 139 utils.PeerTLSEnabledFlag, 140 utils.PeerTLSDirFlag, 141 utils.APITLSEnabledFlag, 142 utils.RPCPortFlag, 143 utils.RPCApiFlag, 144 utils.RPCGlobalGasCap, 145 utils.RPCCORSDomainFlag, 146 utils.RPCVirtualHostsFlag, 147 utils.WSEnabledFlag, 148 utils.WSListenAddrFlag, 149 utils.WSPortFlag, 150 utils.WSApiFlag, 151 utils.WSAllowedOriginsFlag, 152 utils.GraphQLEnabledFlag, 153 utils.GraphQLListenAddrFlag, 154 utils.GraphQLPortFlag, 155 utils.GraphQLCORSDomainFlag, 156 utils.GraphQLVirtualHostsFlag, 157 utils.JSpathFlag, 158 utils.ExecFlag, 159 utils.PreloadJSFlag, 160 }, 161 }, 162 { 163 Name: "NETWORKING", 164 Flags: []cli.Flag{ 165 utils.BootnodesFlag, 166 utils.BootnodesV4Flag, 167 utils.BootnodesV5Flag, 168 utils.ListenPortFlag, 169 utils.MaxPeersFlag, 170 utils.MaxPendingPeersFlag, 171 utils.NATFlag, 172 utils.NoDiscoverFlag, 173 utils.DiscoveryV5Flag, 174 utils.NetrestrictFlag, 175 utils.NodeKeyFileFlag, 176 utils.NodeKeyHexFlag, 177 }, 178 }, 179 { 180 Name: "MINER", 181 Flags: []cli.Flag{ 182 utils.MiningEnabledFlag, 183 utils.MinerThreadsFlag, 184 utils.MinerNotifyFlag, 185 utils.MinerGasPriceFlag, 186 utils.MinerGasTargetFlag, 187 utils.MinerGasLimitFlag, 188 utils.MinerEtherbaseFlag, 189 utils.MinerExtraDataFlag, 190 utils.MinerRecommitIntervalFlag, 191 utils.MinerNoVerifyFlag, 192 utils.MinerNoEmptyBlockFlag, 193 utils.MinerTxLimitFlag, 194 }, 195 }, 196 { 197 Name: "GAS PRICE ORACLE", 198 Flags: []cli.Flag{ 199 utils.GpoBlocksFlag, 200 utils.GpoPercentileFlag, 201 }, 202 }, 203 { 204 Name: "VIRTUAL MACHINE", 205 Flags: []cli.Flag{ 206 utils.VMEnableDebugFlag, 207 utils.EVMInterpreterFlag, 208 utils.EWASMInterpreterFlag, 209 }, 210 }, 211 { 212 Name: "LOGGING AND DEBUGGING", 213 Flags: append([]cli.Flag{ 214 utils.FakePoWFlag, 215 utils.NoCompactionFlag, 216 }, debug.Flags...), 217 }, 218 { 219 Name: "METRICS AND STATS", 220 Flags: metricsFlags, 221 }, 222 { 223 Name: "WHISPER (EXPERIMENTAL)", 224 Flags: whisperFlags, 225 }, 226 { 227 Name: "PBFT", 228 Flags: []cli.Flag{ 229 utils.PbftRequestTimeoutFlag, 230 utils.PbftBlockPeriodFlag, 231 utils.PbftEnableLightFlag, 232 utils.PbftMaxBlockTxsSealFlag, 233 }, 234 }, 235 { 236 Name: "MISC", 237 }, 238 } 239 240 // byCategory sorts an array of flagGroup by Name in the order 241 // defined in AppHelpFlagGroups. 242 type byCategory []flagGroup 243 244 func (a byCategory) Len() int { return len(a) } 245 func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 246 func (a byCategory) Less(i, j int) bool { 247 iCat, jCat := a[i].Name, a[j].Name 248 iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last 249 250 for i, group := range AppHelpFlagGroups { 251 if iCat == group.Name { 252 iIdx = i 253 } 254 if jCat == group.Name { 255 jIdx = i 256 } 257 } 258 259 return iIdx < jIdx 260 } 261 262 func flagCategory(flag cli.Flag) string { 263 for _, category := range AppHelpFlagGroups { 264 for _, flg := range category.Flags { 265 if flg.GetName() == flag.GetName() { 266 return category.Name 267 } 268 } 269 } 270 return "MISC" 271 } 272 273 func init() { 274 // Override the default app help template 275 cli.AppHelpTemplate = AppHelpTemplate 276 277 // Define a one shot struct to pass to the usage template 278 type helpData struct { 279 App interface{} 280 FlagGroups []flagGroup 281 } 282 283 // Override the default app help printer, but only for the global app help 284 originalHelpPrinter := cli.HelpPrinter 285 cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) { 286 if tmpl == AppHelpTemplate { 287 // Iterate over all the flags and add any uncategorized ones 288 categorized := make(map[string]struct{}) 289 for _, group := range AppHelpFlagGroups { 290 for _, flag := range group.Flags { 291 categorized[flag.String()] = struct{}{} 292 } 293 } 294 var uncategorized []cli.Flag 295 for _, flag := range data.(*cli.App).Flags { 296 if _, ok := categorized[flag.String()]; !ok { 297 uncategorized = append(uncategorized, flag) 298 } 299 } 300 if len(uncategorized) > 0 { 301 // Append all ungategorized options to the misc group 302 miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags) 303 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...) 304 305 // Make sure they are removed afterwards 306 defer func() { 307 AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs] 308 }() 309 } 310 // Render out custom usage screen 311 originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups}) 312 } else if tmpl == utils.CommandHelpTemplate { 313 // Iterate over all command specific flags and categorize them 314 categorized := make(map[string][]cli.Flag) 315 for _, flag := range data.(cli.Command).Flags { 316 if _, ok := categorized[flag.String()]; !ok { 317 categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag) 318 } 319 } 320 321 // sort to get a stable ordering 322 sorted := make([]flagGroup, 0, len(categorized)) 323 for cat, flgs := range categorized { 324 sorted = append(sorted, flagGroup{cat, flgs}) 325 } 326 sort.Sort(byCategory(sorted)) 327 328 // add sorted array to data and render with default printer 329 originalHelpPrinter(w, tmpl, map[string]interface{}{ 330 "cmd": data, 331 "categorizedFlags": sorted, 332 }) 333 } else { 334 originalHelpPrinter(w, tmpl, data) 335 } 336 } 337 }