mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 03:18:59 +00:00
142 lines
6.7 KiB
Go
142 lines
6.7 KiB
Go
// Copyright 2012 Jesse van den Kieboom. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package flags provides an extensive command line option parser.
|
|
// The flags package is similar in functionality to the go builtin flag package
|
|
// but provides more options and uses reflection to provide a convenient and
|
|
// succinct way of specifying command line options.
|
|
//
|
|
// Supported features:
|
|
// Options with short names (-v)
|
|
// Options with long names (--verbose)
|
|
// Options with and without arguments (bool v.s. other type)
|
|
// Options with optional arguments and default values
|
|
// Multiple option groups each containing a set of options
|
|
// Generate and print well-formatted help message
|
|
// Passing remaining command line arguments after -- (optional)
|
|
// Ignoring unknown command line options (optional)
|
|
// Supports -I/usr/include -I=/usr/include -I /usr/include option argument specification
|
|
// Supports multiple short options -aux
|
|
// Supports all primitive go types (string, int{8..64}, uint{8..64}, float)
|
|
// Supports same option multiple times (can store in slice or last option counts)
|
|
// Supports maps
|
|
// Supports function callbacks
|
|
//
|
|
// Additional features specific to Windows:
|
|
// Options with short names (/v)
|
|
// Options with long names (/verbose)
|
|
// Windows-style options with arguments use a colon as the delimiter
|
|
// Modify generated help message with Windows-style / options
|
|
//
|
|
// The flags package uses structs, reflection and struct field tags
|
|
// to allow users to specify command line options. This results in very simple
|
|
// and consise specification of your application options. For example:
|
|
//
|
|
// type Options struct {
|
|
// Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
|
|
// }
|
|
//
|
|
// This specifies one option with a short name -v and a long name --verbose.
|
|
// When either -v or --verbose is found on the command line, a 'true' value
|
|
// will be appended to the Verbose field. e.g. when specifying -vvv, the
|
|
// resulting value of Verbose will be {[true, true, true]}.
|
|
//
|
|
// Slice options work exactly the same as primitive type options, except that
|
|
// whenever the option is encountered, a value is appended to the slice.
|
|
//
|
|
// Map options from string to primitive type are also supported. On the command
|
|
// line, you specify the value for such an option as key:value. For example
|
|
//
|
|
// type Options struct {
|
|
// AuthorInfo string[string] `short:"a"`
|
|
// }
|
|
//
|
|
// Then, the AuthorInfo map can be filled with something like
|
|
// -a name:Jesse -a "surname:van den Kieboom".
|
|
//
|
|
// Finally, for full control over the conversion between command line argument
|
|
// values and options, user defined types can choose to implement the Marshaler
|
|
// and Unmarshaler interfaces.
|
|
//
|
|
// Available field tags:
|
|
// short: the short name of the option (single character)
|
|
// long: the long name of the option
|
|
// description: the description of the option (optional)
|
|
// optional: whether an argument of the option is optional (optional)
|
|
// optional-value: the value of an optional option when the option occurs
|
|
// without an argument. This tag can be specified multiple
|
|
// times in the case of maps or slices (optional)
|
|
// default: the default value of an option. This tag can be specified
|
|
// multiple times in the case of slices or maps (optional).
|
|
// default-mask: when specified, this value will be displayed in the help
|
|
// instead of the actual default value. This is useful
|
|
// mostly for hiding otherwise sensitive information from
|
|
// showing up in the help. If default-mask takes the special
|
|
// value "-", then no default value will be shown at all
|
|
// (optional)
|
|
// required: whether an option is required to appear on the command
|
|
// line. If a required option is not present, the parser
|
|
// will return ErrRequired.
|
|
// base: a base (radix) used to convert strings to integer values,
|
|
// the default base is 10 (i.e. decimal) (optional)
|
|
// value-name: the name of the argument value (to be shown in the help,
|
|
// (optional)
|
|
// group: when specified on a struct field, makes the struct field
|
|
// a separate group with the given name (optional).
|
|
// command: when specified on a struct field, makes the struct field
|
|
// a (sub)command with the given name (optional).
|
|
//
|
|
// Either short: or long: must be specified to make the field eligible as an
|
|
// option.
|
|
//
|
|
//
|
|
// Option groups:
|
|
//
|
|
// Option groups are a simple way to semantically separate your options. The
|
|
// only real difference is in how your options will appear in the builtin
|
|
// generated help. All options in a particular group are shown together in the
|
|
// help under the name of the group.
|
|
//
|
|
// There are currently three ways to specify option groups.
|
|
//
|
|
// 1. Use NewNamedParser specifying the various option groups.
|
|
// 2. Use AddGroup to add a group to an existing parser.
|
|
// 3. Add a struct field to the toplevel options annotated with the
|
|
// group:"group-name" tag.
|
|
//
|
|
//
|
|
//
|
|
// Commands:
|
|
//
|
|
// The flags package also has basic support for commands. Commands are often
|
|
// used in monolithic applications that support various commands or actions.
|
|
// Take git for example, all of the add, commit, checkout, etc. are called
|
|
// commands. Using commands you can easily separate multiple functions of your
|
|
// application.
|
|
//
|
|
// There are currently two ways to specifiy a command.
|
|
//
|
|
// 1. Use AddCommand on an existing parser.
|
|
// 2. Add a struct field to your options struct annotated with the
|
|
// command:"command-name" tag.
|
|
//
|
|
// The most common, idiomatic way to implement commands is to define a global
|
|
// parser instance and implement each command in a separate file. These
|
|
// command files should define a go init function which calls AddCommand on
|
|
// the global parser.
|
|
//
|
|
// When parsing ends and there is an active command and that command implements
|
|
// the Commander interface, then its Execute method will be run with the
|
|
// remaining command line arguments.
|
|
//
|
|
// Command structs can have options which become valid to parse after the
|
|
// command has been specified on the command line. It is currently not valid
|
|
// to specify options from the parent level of the command after the command
|
|
// name has occurred. Thus, given a toplevel option "-v" and a command "add":
|
|
//
|
|
// Valid: ./app -v add
|
|
// Invalid: ./app add -v
|
|
//
|
|
package flags
|