in cli/parser.go [81:137]
func (p *Parser) readNext() (arg string, flag *Flag, more bool, err error) {
if p.current >= len(p.args) {
more = false
return
}
s := p.args[p.current]
p.current++
more = true
value := ""
flag, value, err = p.parseCommandArg(s)
if err != nil {
return
}
if flag != nil {
err = flag.setIsAssigned()
if err != nil {
return
}
}
// fmt.Printf(">>> current=%v\n flag=%v\n value=%s\n err=%s\n", p.currentFlag, flag, value, err)
if flag == nil { // parse with value xxxx
if p.currentFlag != nil { // value need to feed to previous flag xxx
err = p.currentFlag.assign(value)
if err != nil {
return
}
if !p.currentFlag.needValue() { // if current flag is feeds close it
// fmt.Printf("$$$ clear %s\n", p.currentFlag.AssignedMode)
p.currentFlag = nil
}
} else {
arg = value // this is a arg
}
} else { // parse with flag --xxx or -x
if p.currentFlag != nil {
err = p.currentFlag.validate()
if err != nil {
return
}
p.currentFlag = nil
}
if value != "" { // pattern --xx=aa, -x:aa, -xxx=bb
err = flag.assign(value)
if err != nil {
return
}
} else { // pattern --xx -- yy
if flag.needValue() {
p.currentFlag = flag
}
}
}
return
}