// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by generate-types. DO NOT EDIT.

package proto

import (
	"math"
	"unicode/utf8"

	"google.golang.org/protobuf/internal/encoding/wire"
	"google.golang.org/protobuf/internal/errors"
	"google.golang.org/protobuf/internal/strs"
	"google.golang.org/protobuf/reflect/protoreflect"
)

// unmarshalScalar decodes a value of the given kind.
//
// Message values are decoded into a []byte which aliases the input data.
func (o UnmarshalOptions) unmarshalScalar(b []byte, wtyp wire.Type, fd protoreflect.FieldDescriptor) (val protoreflect.Value, n int, err error) {
	switch fd.Kind() {
	case protoreflect.BoolKind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfBool(wire.DecodeBool(v)), n, nil
	case protoreflect.EnumKind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)), n, nil
	case protoreflect.Int32Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt32(int32(v)), n, nil
	case protoreflect.Sint32Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))), n, nil
	case protoreflect.Uint32Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfUint32(uint32(v)), n, nil
	case protoreflect.Int64Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt64(int64(v)), n, nil
	case protoreflect.Sint64Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt64(wire.DecodeZigZag(v)), n, nil
	case protoreflect.Uint64Kind:
		if wtyp != wire.VarintType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfUint64(v), n, nil
	case protoreflect.Sfixed32Kind:
		if wtyp != wire.Fixed32Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt32(int32(v)), n, nil
	case protoreflect.Fixed32Kind:
		if wtyp != wire.Fixed32Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfUint32(uint32(v)), n, nil
	case protoreflect.FloatKind:
		if wtyp != wire.Fixed32Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))), n, nil
	case protoreflect.Sfixed64Kind:
		if wtyp != wire.Fixed64Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfInt64(int64(v)), n, nil
	case protoreflect.Fixed64Kind:
		if wtyp != wire.Fixed64Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfUint64(v), n, nil
	case protoreflect.DoubleKind:
		if wtyp != wire.Fixed64Type {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfFloat64(math.Float64frombits(v)), n, nil
	case protoreflect.StringKind:
		if wtyp != wire.BytesType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
			return protoreflect.Value{}, 0, errors.InvalidUTF8(string(fd.FullName()))
		}
		return protoreflect.ValueOfString(string(v)), n, nil
	case protoreflect.BytesKind:
		if wtyp != wire.BytesType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfBytes(append(emptyBuf[:], v...)), n, nil
	case protoreflect.MessageKind:
		if wtyp != wire.BytesType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfBytes(v), n, nil
	case protoreflect.GroupKind:
		if wtyp != wire.StartGroupType {
			return val, 0, errUnknown
		}
		v, n := wire.ConsumeGroup(fd.Number(), b)
		if n < 0 {
			return val, 0, wire.ParseError(n)
		}
		return protoreflect.ValueOfBytes(v), n, nil
	default:
		return val, 0, errUnknown
	}
}

func (o UnmarshalOptions) unmarshalList(b []byte, wtyp wire.Type, list protoreflect.List, fd protoreflect.FieldDescriptor) (n int, err error) {
	switch fd.Kind() {
	case protoreflect.BoolKind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
		return n, nil
	case protoreflect.EnumKind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
		return n, nil
	case protoreflect.Int32Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt32(int32(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt32(int32(v)))
		return n, nil
	case protoreflect.Sint32Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
		return n, nil
	case protoreflect.Uint32Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfUint32(uint32(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfUint32(uint32(v)))
		return n, nil
	case protoreflect.Int64Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt64(int64(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt64(int64(v)))
		return n, nil
	case protoreflect.Sint64Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
		return n, nil
	case protoreflect.Uint64Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeVarint(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfUint64(v))
			}
			return n, nil
		}
		if wtyp != wire.VarintType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeVarint(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfUint64(v))
		return n, nil
	case protoreflect.Sfixed32Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed32(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt32(int32(v)))
			}
			return n, nil
		}
		if wtyp != wire.Fixed32Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt32(int32(v)))
		return n, nil
	case protoreflect.Fixed32Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed32(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfUint32(uint32(v)))
			}
			return n, nil
		}
		if wtyp != wire.Fixed32Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfUint32(uint32(v)))
		return n, nil
	case protoreflect.FloatKind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed32(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
			}
			return n, nil
		}
		if wtyp != wire.Fixed32Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed32(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
		return n, nil
	case protoreflect.Sfixed64Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed64(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfInt64(int64(v)))
			}
			return n, nil
		}
		if wtyp != wire.Fixed64Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfInt64(int64(v)))
		return n, nil
	case protoreflect.Fixed64Kind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed64(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfUint64(v))
			}
			return n, nil
		}
		if wtyp != wire.Fixed64Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfUint64(v))
		return n, nil
	case protoreflect.DoubleKind:
		if wtyp == wire.BytesType {
			buf, n := wire.ConsumeBytes(b)
			if n < 0 {
				return 0, wire.ParseError(n)
			}
			for len(buf) > 0 {
				v, n := wire.ConsumeFixed64(buf)
				if n < 0 {
					return 0, wire.ParseError(n)
				}
				buf = buf[n:]
				list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
			}
			return n, nil
		}
		if wtyp != wire.Fixed64Type {
			return 0, errUnknown
		}
		v, n := wire.ConsumeFixed64(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
		return n, nil
	case protoreflect.StringKind:
		if wtyp != wire.BytesType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
			return 0, errors.InvalidUTF8(string(fd.FullName()))
		}
		list.Append(protoreflect.ValueOfString(string(v)))
		return n, nil
	case protoreflect.BytesKind:
		if wtyp != wire.BytesType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		list.Append(protoreflect.ValueOfBytes(append(emptyBuf[:], v...)))
		return n, nil
	case protoreflect.MessageKind:
		if wtyp != wire.BytesType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeBytes(b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		m := list.NewElement()
		if err := o.unmarshalMessage(v, m.Message()); err != nil {
			return 0, err
		}
		list.Append(m)
		return n, nil
	case protoreflect.GroupKind:
		if wtyp != wire.StartGroupType {
			return 0, errUnknown
		}
		v, n := wire.ConsumeGroup(fd.Number(), b)
		if n < 0 {
			return 0, wire.ParseError(n)
		}
		m := list.NewElement()
		if err := o.unmarshalMessage(v, m.Message()); err != nil {
			return 0, err
		}
		list.Append(m)
		return n, nil
	default:
		return 0, errUnknown
	}
}

// We append to an empty array rather than a nil []byte to get non-nil zero-length byte slices.
var emptyBuf [0]byte
