@@ -129,18 +129,22 @@ func parse(doc string, argv []string, help bool, version string, optionsFirst bo
129
129
return
130
130
}
131
131
matched , left , collected := pat .match (& patternArgv , nil )
132
- if matched && len (* left ) == 0 {
133
- patFlat , err = pat .flat (patternDefault )
134
- if err != nil {
135
- output = handleError (err , usage )
136
- return
132
+ if ! matched || len (* left ) > 0 {
133
+ badArgs := left .ArgumentsString ()
134
+ if len (badArgs ) > 0 {
135
+ err = newUserError ("unexpected arguments: " + badArgs )
136
+ } else {
137
+ err = newUserError ("" )
137
138
}
138
- args = append ( patFlat , * collected ... ). dictionary ( )
139
+ output = handleError ( err , usage )
139
140
return
140
141
}
141
-
142
- err = newUserError ("" )
143
- output = handleError (err , usage )
142
+ patFlat , err = pat .flat (patternDefault )
143
+ if err != nil {
144
+ output = handleError (err , usage )
145
+ return
146
+ }
147
+ args = append (patFlat , * collected ... ).dictionary ()
144
148
return
145
149
}
146
150
@@ -1215,6 +1219,20 @@ func (pl patternList) dictionary() map[string]interface{} {
1215
1219
return dict
1216
1220
}
1217
1221
1222
+ // ArgumentsString converts patternList into a space separated string of
1223
+ // arguments; it ignores any patterns that are not arguments, and does not walk
1224
+ // children.
1225
+ func (pl patternList ) ArgumentsString () string {
1226
+ args := []string {}
1227
+ for _ , arg := range pl {
1228
+ argStr , ok := arg .value .(string )
1229
+ if ok && (arg .t & patternArgument ) != 0 {
1230
+ args = append (args , argStr )
1231
+ }
1232
+ }
1233
+ return strings .Join (args , " " )
1234
+ }
1235
+
1218
1236
func stringPartition (s , sep string ) (string , string , string ) {
1219
1237
sepPos := strings .Index (s , sep )
1220
1238
if sepPos == - 1 { // no seperator found
0 commit comments