package pflag import "fmt" // notExistErrorMessageType specifies which flavor of "flag does not exist" // is printed by NotExistError. This allows the related errors to be grouped // under a single NotExistError struct without making a breaking change to // the error message text. type notExistErrorMessageType int const ( flagNotExistMessage notExistErrorMessageType = iota flagNotDefinedMessage flagNoSuchFlagMessage flagUnknownFlagMessage flagUnknownShorthandFlagMessage ) // NotExistError is the error returned when trying to access a flag that // does not exist in the FlagSet. type NotExistError struct { name string specifiedShorthands string messageType notExistErrorMessageType } // Error implements error. func (e *NotExistError) Error() string { switch e.messageType { case flagNotExistMessage: return fmt.Sprintf("flag %q does not exist", e.name) case flagNotDefinedMessage: return fmt.Sprintf("flag accessed but not defined: %s", e.name) case flagNoSuchFlagMessage: return fmt.Sprintf("no such flag -%v", e.name) case flagUnknownFlagMessage: return fmt.Sprintf("unknown flag: --%s", e.name) case flagUnknownShorthandFlagMessage: c := rune(e.name[0]) return fmt.Sprintf("unknown shorthand flag: %q in -%s", c, e.specifiedShorthands) } panic(fmt.Errorf("unknown flagNotExistErrorMessageType: %v", e.messageType)) } // GetSpecifiedName returns the name of the flag (without dashes) as it // appeared in the parsed arguments. func (e *NotExistError) GetSpecifiedName() string { return e.name } // GetSpecifiedShortnames returns the group of shorthand arguments // (without dashes) that the flag appeared within. If the flag was not in a // shorthand group, this will return an empty string. func (e *NotExistError) GetSpecifiedShortnames() string { return e.specifiedShorthands } // ValueRequiredError is the error returned when a flag needs an argument but // no argument was provided. type ValueRequiredError struct { flag *Flag specifiedName string specifiedShorthands string } // Error implements error. func (e *ValueRequiredError) Error() string { if len(e.specifiedShorthands) > 0 { c := rune(e.specifiedName[0]) return fmt.Sprintf("flag needs an argument: %q in -%s", c, e.specifiedShorthands) } return fmt.Sprintf("flag needs an argument: --%s", e.specifiedName) } // GetFlag returns the flag for which the error occurred. func (e *ValueRequiredError) GetFlag() *Flag { return e.flag } // GetSpecifiedName returns the name of the flag (without dashes) as it // appeared in the parsed arguments. func (e *ValueRequiredError) GetSpecifiedName() string { return e.specifiedName } // GetSpecifiedShortnames returns the group of shorthand arguments // (without dashes) that the flag appeared within. If the flag was not in a // shorthand group, this will return an empty string. func (e *ValueRequiredError) GetSpecifiedShortnames() string { return e.specifiedShorthands } // InvalidValueError is the error returned when an invalid value is used // for a flag. type InvalidValueError struct { flag *Flag value string cause error } // Error implements error. func (e *InvalidValueError) Error() string { flag := e.flag var flagName string if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name) } else { flagName = fmt.Sprintf("--%s", flag.Name) } return fmt.Sprintf("invalid argument %q for %q flag: %v", e.value, flagName, e.cause) } // Unwrap implements errors.Unwrap. func (e *InvalidValueError) Unwrap() error { return e.cause } // GetFlag returns the flag for which the error occurred. func (e *InvalidValueError) GetFlag() *Flag { return e.flag } // GetValue returns the invalid value that was provided. func (e *InvalidValueError) GetValue() string { return e.value } // InvalidSyntaxError is the error returned when a bad flag name is passed on // the command line. type InvalidSyntaxError struct { specifiedFlag string } // Error implements error. func (e *InvalidSyntaxError) Error() string { return fmt.Sprintf("bad flag syntax: %s", e.specifiedFlag) } // GetSpecifiedName returns the exact flag (with dashes) as it // appeared in the parsed arguments. func (e *InvalidSyntaxError) GetSpecifiedFlag() string { return e.specifiedFlag }