@@ -9,7 +9,7 @@ func (s *OptionSet) splitMergedArg(arg *Arg) (args []*Arg, success bool) {
99 optionMap := s .flagOptionMap
1010 argText := arg .Text
1111
12- if arg .Type != UnknownArg ||
12+ if arg .Type != UndetermArg ||
1313 len (argText ) <= len (s .mergeFlagPrefix ) ||
1414 ! strings .HasPrefix (argText , s .mergeFlagPrefix ) {
1515 return
@@ -49,7 +49,7 @@ func (s *OptionSet) splitMergedArg(arg *Arg) (args []*Arg, success bool) {
4949 }
5050
5151 // re-generate standalone flag with values
52- splittedArgs [len (splittedArgs )- 1 ] = NewArg (prevFlag .Name + mergedArgs [i :], UnknownArg )
52+ splittedArgs [len (splittedArgs )- 1 ] = NewArg (prevFlag .Name + mergedArgs [i :], UndetermArg )
5353 break
5454 }
5555
@@ -72,7 +72,7 @@ func (s *OptionSet) splitMergedArgs(initArgs []*Arg) []*Arg {
7272func (s * OptionSet ) splitAssignSignArg (arg * Arg ) (args []* Arg ) {
7373 args = make ([]* Arg , 0 , 2 )
7474
75- if arg .Type != UnknownArg {
75+ if arg .Type != UndetermArg {
7676 args = append (args , arg )
7777 return
7878 }
@@ -115,7 +115,7 @@ func (s *OptionSet) splitAssignSignArgs(initArgs []*Arg) []*Arg {
115115func (s * OptionSet ) splitConcatAssignArg (arg * Arg ) (args []* Arg ) {
116116 args = make ([]* Arg , 0 , 2 )
117117
118- if arg .Type != UnknownArg {
118+ if arg .Type != UndetermArg {
119119 args = append (args , arg )
120120 return
121121 }
@@ -149,20 +149,37 @@ func (s *OptionSet) splitConcatAssignArgs(initArgs []*Arg) []*Arg {
149149 return args
150150}
151151
152+ func (s * OptionSet ) markUndefArgsValues (args []* Arg ) {
153+ foundUndefFlag := false
154+ for _ , arg := range args {
155+ if arg .Type != UndetermArg {
156+ foundUndefFlag = false
157+ continue
158+ }
159+ if s .isUdefFlag (arg .Text ) {
160+ arg .Type = UndefFlagArg
161+ foundUndefFlag = true
162+ } else if foundUndefFlag {
163+ arg .Type = UndefFlagValueArg
164+ }
165+ }
166+ }
167+
152168func isValueArg (flag * Flag , arg * Arg ) bool {
153169 switch arg .Type {
154170 case ValueArg :
155171 return true
156- case UnknownArg :
172+ case UndetermArg :
157173 return flag .canFollowAssign
158174 default :
159175 return false
160176 }
161177}
162178
163- func (s * OptionSet ) parseArgsInGroup (argObjs []* Arg ) (args map [string ][]string , rests []string ) {
179+ func (s * OptionSet ) parseArgsInGroup (argObjs []* Arg ) (args map [string ][]string , rests , undefs []string ) {
164180 args = map [string ][]string {}
165181 rests = []string {}
182+ undefs = []string {}
166183
167184 flagOptionMap := s .flagOptionMap
168185 flagMap := s .flagMap
@@ -177,22 +194,36 @@ func (s *OptionSet) parseArgsInGroup(argObjs []*Arg) (args map[string][]string,
177194 argObjs = s .splitConcatAssignArgs (argObjs )
178195 }
179196
197+ s .markUndefArgsValues (argObjs )
198+
180199 // walk
181200 for i , argCount , peeked := 0 , len (argObjs ), 0 ; i < argCount ; i , peeked = i + 1 + peeked , 0 {
182201 arg := argObjs [i ]
183202
203+ // rests
184204 if arg .Type == RestSignArg {
185205 continue
186206 }
187207
188- if arg .Type == UnknownArg {
208+ if arg .Type == UndetermArg {
189209 arg .Type = RestArg
190210 }
191211 if arg .Type == RestArg {
192212 rests = append (rests , arg .Text )
193213 continue
194214 }
195215
216+ // undefs
217+ if arg .Type == UndefFlagValueArg {
218+ continue
219+ }
220+
221+ if arg .Type == UndefFlagArg {
222+ undefs = append (undefs , arg .Text )
223+ continue
224+ }
225+
226+ // normal
196227 opt := flagOptionMap [arg .Text ]
197228 flag := flagMap [arg .Text ]
198229
@@ -253,15 +284,15 @@ func (s *OptionSet) parseArgsInGroup(argObjs []*Arg) (args map[string][]string,
253284 }
254285 }
255286
256- return args , rests
287+ return args , rests , undefs
257288}
258289
259290func (s * OptionSet ) parseInGroup (argObjs , configObjs []* Arg ) * ParseResult {
260291 keyOptionMap := s .keyOptionMap
261292
262- args , argRests := s .parseArgsInGroup (argObjs )
293+ args , argRests , argUndefs := s .parseArgsInGroup (argObjs )
263294 envs := s .keyEnvMap
264- configs , configRests := s .parseArgsInGroup (configObjs )
295+ configs , configRests , configUndefs := s .parseArgsInGroup (configObjs )
265296 defaults := s .keyDefaultMap
266297
267298 return & ParseResult {
@@ -274,6 +305,9 @@ func (s *OptionSet) parseInGroup(argObjs, configObjs []*Arg) *ParseResult {
274305
275306 argRests : argRests ,
276307 configRests : configRests ,
308+
309+ argUndefs : argUndefs ,
310+ configUndefs : configUndefs ,
277311 }
278312}
279313
@@ -283,7 +317,7 @@ func (s *OptionSet) getNormalizedArgs(initArgs []string) []*Arg {
283317 foundRestSign := false
284318 for _ , arg := range initArgs {
285319 switch {
286- case s .isGroupSeps (arg ):
320+ case s .isGroupSep (arg ):
287321 foundRestSign = false
288322 args = append (args , NewArg (arg , GroupSepArg ))
289323 case foundRestSign :
@@ -294,7 +328,7 @@ func (s *OptionSet) getNormalizedArgs(initArgs []string) []*Arg {
294328 case s .flagMap [arg ] != nil :
295329 args = append (args , NewArg (arg , FlagArg ))
296330 default :
297- args = append (args , NewArg (arg , UnknownArg ))
331+ args = append (args , NewArg (arg , UndetermArg ))
298332 }
299333 }
300334
0 commit comments