Example #1
0
func (p *parser) readFieldOptions(f *ast.Field) *parseError {
	if err := p.readToken("["); err != nil {
		return err
	}
	for !p.done {
		tok := p.next()
		if tok.err != nil {
			return tok.err
		}
		// TODO: support more options than just default and packed
		switch tok.value {
		case "default":
			f.HasDefault = true
			if err := p.readToken("="); err != nil {
				return err
			}
			tok := p.next()
			if tok.err != nil {
				return tok.err
			}
			// TODO: check type
			switch f.TypeName {
			case "string":
				f.Default = tok.unquoted
			default:
				f.Default = tok.value
			}
		case "packed":
			f.HasPacked = true
			if err := p.readToken("="); err != nil {
				return err
			}
			packed, err := p.readBool()
			if err != nil {
				return err
			}
			f.Packed = packed
		default:
			return p.errorf(`got %q, want "default" or "packed"`, tok.value)
		}
		// next should be a comma or ]
		tok = p.next()
		if tok.err != nil {
			return tok.err
		}
		if tok.value == "," {
			continue
		}
		if tok.value == "]" {
			return nil
		}
		return p.errorf(`got %q, want "," or "]"`, tok.value)
	}
	return p.errorf("unexpected EOF while parsing field options")
}