1package flags 2 3import ( 4 "fmt" 5) 6 7// ErrorType represents the type of error. 8type ErrorType uint 9 10const ( 11 // ErrUnknown indicates a generic error. 12 ErrUnknown ErrorType = iota 13 14 // ErrExpectedArgument indicates that an argument was expected. 15 ErrExpectedArgument 16 17 // ErrUnknownFlag indicates an unknown flag. 18 ErrUnknownFlag 19 20 // ErrUnknownGroup indicates an unknown group. 21 ErrUnknownGroup 22 23 // ErrMarshal indicates a marshalling error while converting values. 24 ErrMarshal 25 26 // ErrHelp indicates that the built-in help was shown (the error 27 // contains the help message). 28 ErrHelp 29 30 // ErrNoArgumentForBool indicates that an argument was given for a 31 // boolean flag (which don't not take any arguments). 32 ErrNoArgumentForBool 33 34 // ErrRequired indicates that a required flag was not provided. 35 ErrRequired 36 37 // ErrShortNameTooLong indicates that a short flag name was specified, 38 // longer than one character. 39 ErrShortNameTooLong 40 41 // ErrDuplicatedFlag indicates that a short or long flag has been 42 // defined more than once 43 ErrDuplicatedFlag 44 45 // ErrTag indicates an error while parsing flag tags. 46 ErrTag 47 48 // ErrCommandRequired indicates that a command was required but not 49 // specified 50 ErrCommandRequired 51 52 // ErrUnknownCommand indicates that an unknown command was specified. 53 ErrUnknownCommand 54 55 // ErrInvalidChoice indicates an invalid option value which only allows 56 // a certain number of choices. 57 ErrInvalidChoice 58 59 // ErrInvalidTag indicates an invalid tag or invalid use of an existing tag 60 ErrInvalidTag 61) 62 63func (e ErrorType) String() string { 64 switch e { 65 case ErrUnknown: 66 return "unknown" 67 case ErrExpectedArgument: 68 return "expected argument" 69 case ErrUnknownFlag: 70 return "unknown flag" 71 case ErrUnknownGroup: 72 return "unknown group" 73 case ErrMarshal: 74 return "marshal" 75 case ErrHelp: 76 return "help" 77 case ErrNoArgumentForBool: 78 return "no argument for bool" 79 case ErrRequired: 80 return "required" 81 case ErrShortNameTooLong: 82 return "short name too long" 83 case ErrDuplicatedFlag: 84 return "duplicated flag" 85 case ErrTag: 86 return "tag" 87 case ErrCommandRequired: 88 return "command required" 89 case ErrUnknownCommand: 90 return "unknown command" 91 case ErrInvalidChoice: 92 return "invalid choice" 93 case ErrInvalidTag: 94 return "invalid tag" 95 } 96 97 return "unrecognized error type" 98} 99 100func (e ErrorType) Error() string { 101 return e.String() 102} 103 104// Error represents a parser error. The error returned from Parse is of this 105// type. The error contains both a Type and Message. 106type Error struct { 107 // The type of error 108 Type ErrorType 109 110 // The error message 111 Message string 112} 113 114// Error returns the error's message 115func (e *Error) Error() string { 116 return e.Message 117} 118 119func newError(tp ErrorType, message string) *Error { 120 return &Error{ 121 Type: tp, 122 Message: message, 123 } 124} 125 126func newErrorf(tp ErrorType, format string, args ...interface{}) *Error { 127 return newError(tp, fmt.Sprintf(format, args...)) 128} 129 130func wrapError(err error) *Error { 131 ret, ok := err.(*Error) 132 133 if !ok { 134 return newError(ErrUnknown, err.Error()) 135 } 136 137 return ret 138} 139