func()

in proto/text_decode.go [258:366]


func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
	tok := p.next()
	if tok.err != nil {
		return v, tok.err
	}
	if tok.value == "" {
		return v, p.errorf("unexpected EOF")
	}

	switch {
	case fd.IsList():
		lv := v.List()
		var err error
		if tok.value == "[" {
			// Repeated field with list notation, like [1,2,3].
			for {
				vv := lv.NewElement()
				vv, err = p.unmarshalSingularValue(vv, fd)
				if err != nil {
					return v, err
				}
				lv.Append(vv)

				tok := p.next()
				if tok.err != nil {
					return v, tok.err
				}
				if tok.value == "]" {
					break
				}
				if tok.value != "," {
					return v, p.errorf("Expected ']' or ',' found %q", tok.value)
				}
			}
			return v, nil
		}

		// One value of the repeated field.
		p.back()
		vv := lv.NewElement()
		vv, err = p.unmarshalSingularValue(vv, fd)
		if err != nil {
			return v, err
		}
		lv.Append(vv)
		return v, nil
	case fd.IsMap():
		// The map entry should be this sequence of tokens:
		//	< key : KEY value : VALUE >
		// However, implementations may omit key or value, and technically
		// we should support them in any order.
		var terminator string
		switch tok.value {
		case "<":
			terminator = ">"
		case "{":
			terminator = "}"
		default:
			return v, p.errorf("expected '{' or '<', found %q", tok.value)
		}

		keyFD := fd.MapKey()
		valFD := fd.MapValue()

		mv := v.Map()
		kv := keyFD.Default()
		vv := mv.NewValue()
		for {
			tok := p.next()
			if tok.err != nil {
				return v, tok.err
			}
			if tok.value == terminator {
				break
			}
			var err error
			switch tok.value {
			case "key":
				if err := p.consumeToken(":"); err != nil {
					return v, err
				}
				if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil {
					return v, err
				}
				if err := p.consumeOptionalSeparator(); err != nil {
					return v, err
				}
			case "value":
				if err := p.checkForColon(valFD); err != nil {
					return v, err
				}
				if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil {
					return v, err
				}
				if err := p.consumeOptionalSeparator(); err != nil {
					return v, err
				}
			default:
				p.back()
				return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value)
			}
		}
		mv.Set(kv.MapKey(), vv)
		return v, nil
	default:
		p.back()
		return p.unmarshalSingularValue(v, fd)
	}
}