func()

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
}