123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- // Copyright 2020 The go-ethereum Authors
- // This file is part of go-ethereum.
- //
- // go-ethereum is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // go-ethereum is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
- package flags
- import (
- "os"
- "path/filepath"
- "github.com/ethereum/go-ethereum/params"
- "gopkg.in/urfave/cli.v1"
- )
- var (
- CommandHelpTemplate = `{{.cmd.Name}}{{if .cmd.Subcommands}} command{{end}}{{if .cmd.Flags}} [command options]{{end}} {{.cmd.ArgsUsage}}
- {{if .cmd.Description}}{{.cmd.Description}}
- {{end}}{{if .cmd.Subcommands}}
- SUBCOMMANDS:
- {{range .cmd.Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}}
- {{end}}{{end}}{{if .categorizedFlags}}
- {{range $idx, $categorized := .categorizedFlags}}{{$categorized.Name}} OPTIONS:
- {{range $categorized.Flags}}{{"\t"}}{{.}}
- {{end}}
- {{end}}{{end}}`
- OriginCommandHelpTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} {{.ArgsUsage}}
- {{if .Description}}{{.Description}}
- {{end}}{{if .Subcommands}}
- SUBCOMMANDS:
- {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}}
- {{end}}{{end}}{{if .Flags}}
- OPTIONS:
- {{range $.Flags}} {{.}}
- {{end}}
- {{end}}`
- // AppHelpTemplate is the test template for the default, global app help topic.
- AppHelpTemplate = `NAME:
- {{.App.Name}} - {{.App.Usage}}
- Copyright 2013-2021 The go-ethereum Authors
- USAGE:
- {{.App.HelpName}} [options]{{if .App.Commands}} [command] [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}
- {{if .App.Version}}
- VERSION:
- {{.App.Version}}
- {{end}}{{if len .App.Authors}}
- AUTHOR(S):
- {{range .App.Authors}}{{ . }}{{end}}
- {{end}}{{if .App.Commands}}
- COMMANDS:
- {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
- {{end}}{{end}}{{if .FlagGroups}}
- {{range .FlagGroups}}{{.Name}} OPTIONS:
- {{range .Flags}}{{.}}
- {{end}}
- {{end}}{{end}}{{if .App.Copyright }}
- COPYRIGHT:
- {{.App.Copyright}}
- {{end}}
- `
- // ClefAppHelpTemplate is the template for the default, global app help topic.
- ClefAppHelpTemplate = `NAME:
- {{.App.Name}} - {{.App.Usage}}
- Copyright 2013-2021 The go-ethereum Authors
- USAGE:
- {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}
- {{if .App.Version}}
- COMMANDS:
- {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
- {{end}}{{end}}{{if .FlagGroups}}
- {{range .FlagGroups}}{{.Name}} OPTIONS:
- {{range .Flags}}{{.}}
- {{end}}
- {{end}}{{end}}{{if .App.Copyright }}
- COPYRIGHT:
- {{.App.Copyright}}
- {{end}}
- `
- )
- // HelpData is a one shot struct to pass to the usage template
- type HelpData struct {
- App interface{}
- FlagGroups []FlagGroup
- }
- // FlagGroup is a collection of flags belonging to a single topic.
- type FlagGroup struct {
- Name string
- Flags []cli.Flag
- }
- // byCategory sorts an array of FlagGroup by Name in the order
- // defined in AppHelpFlagGroups.
- type ByCategory []FlagGroup
- func (a ByCategory) Len() int { return len(a) }
- func (a ByCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
- func (a ByCategory) Less(i, j int) bool {
- iCat, jCat := a[i].Name, a[j].Name
- iIdx, jIdx := len(a), len(a) // ensure non categorized flags come last
- for i, group := range a {
- if iCat == group.Name {
- iIdx = i
- }
- if jCat == group.Name {
- jIdx = i
- }
- }
- return iIdx < jIdx
- }
- func FlagCategory(flag cli.Flag, flagGroups []FlagGroup) string {
- for _, category := range flagGroups {
- for _, flg := range category.Flags {
- if flg.GetName() == flag.GetName() {
- return category.Name
- }
- }
- }
- return "MISC"
- }
- // NewApp creates an app with sane defaults.
- func NewApp(gitCommit, gitDate, usage string) *cli.App {
- app := cli.NewApp()
- app.Name = filepath.Base(os.Args[0])
- app.Author = ""
- app.Email = ""
- app.Version = params.VersionWithCommit(gitCommit, gitDate)
- app.Usage = usage
- return app
- }
|