// Copyright 2019 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.

package proto

import (
	
	
	
	
	
	
	
)

func ( MarshalOptions) ( protoreflect.Message) ( int) {
	.Range(func( protoreflect.FieldDescriptor,  protoreflect.Value) bool {
		 += messageset.SizeField(.Number())
		 += protowire.SizeTag(messageset.FieldMessage)
		 += protowire.SizeBytes(.size(.Message()))
		return true
	})
	 += messageset.SizeUnknown(.GetUnknown())
	return 
}

func ( MarshalOptions) ( []byte,  protoreflect.Message) ([]byte, error) {
	if !flags.ProtoLegacy {
		return , errors.New("no support for message_set_wire_format")
	}
	 := order.AnyFieldOrder
	if .Deterministic {
		 = order.NumberFieldOrder
	}
	var  error
	order.RangeFields(, , func( protoreflect.FieldDescriptor,  protoreflect.Value) bool {
		,  = .marshalMessageSetField(, , )
		return  == nil
	})
	if  != nil {
		return , 
	}
	return messageset.AppendUnknown(, .GetUnknown())
}

func ( MarshalOptions) ( []byte,  protoreflect.FieldDescriptor,  protoreflect.Value) ([]byte, error) {
	 = messageset.AppendFieldStart(, .Number())
	 = protowire.AppendTag(, messageset.FieldMessage, protowire.BytesType)
	 = protowire.AppendVarint(, uint64(.Size(.Message().Interface())))
	,  := .marshalMessage(, .Message())
	if  != nil {
		return , 
	}
	 = messageset.AppendFieldEnd()
	return , nil
}

func ( UnmarshalOptions) ( []byte,  protoreflect.Message) error {
	if !flags.ProtoLegacy {
		return errors.New("no support for message_set_wire_format")
	}
	return messageset.Unmarshal(, false, func( protowire.Number,  []byte) error {
		 := .unmarshalMessageSetField(, , )
		if  == errUnknown {
			 := .GetUnknown()
			 = protowire.AppendTag(, , protowire.BytesType)
			 = protowire.AppendBytes(, )
			.SetUnknown()
			return nil
		}
		return 
	})
}

func ( UnmarshalOptions) ( protoreflect.Message,  protowire.Number,  []byte) error {
	 := .Descriptor()
	if !.ExtensionRanges().Has() {
		return errUnknown
	}
	,  := .Resolver.FindExtensionByNumber(.FullName(), )
	if  == protoregistry.NotFound {
		return errUnknown
	}
	if  != nil {
		return errors.New("%v: unable to resolve extension %v: %v", .FullName(), , )
	}
	 := .TypeDescriptor()
	if  := .unmarshalMessage(, .Mutable().Message());  != nil {
		return 
	}
	return nil
}