// Copyright 2024 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 protoc-gen-go. DO NOT EDIT.
// source: cmd/protoc-gen-go/testdata/protoeditions/maps_and_delimited.proto

package protoeditions

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

type MessageWithMaps struct {
	state              protoimpl.MessageState                   `protogen:"open.v1"`
	MapWithoutMessage  map[string]string                        `protobuf:"bytes,1,rep,name=map_without_message,json=mapWithoutMessage" json:"map_without_message,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	MapWithoutMessageB map[uint32][]byte                        `protobuf:"bytes,2,rep,name=map_without_message_b,json=mapWithoutMessageB" json:"map_without_message_b,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	MapWithMessage     map[int64]*MessageWithMaps_NestedMessage `protobuf:"bytes,3,rep,name=map_with_message,json=mapWithMessage" json:"map_with_message,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	NestedMessage      *MessageWithMaps_NestedMessage           `protobuf:"group,4,opt,name=NestedMessage,json=nestedMessage" json:"nested_message,omitempty"`
	RepeatedMessage    []*MessageWithMaps_NestedMessage         `protobuf:"group,5,rep,name=NestedMessage,json=repeatedMessage" json:"repeated_message,omitempty"`
	unknownFields      protoimpl.UnknownFields
	sizeCache          protoimpl.SizeCache
}

func (x *MessageWithMaps) Reset() {
	*x = MessageWithMaps{}
	mi := &file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *MessageWithMaps) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MessageWithMaps) ProtoMessage() {}

func (x *MessageWithMaps) ProtoReflect() protoreflect.Message {
	mi := &file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use MessageWithMaps.ProtoReflect.Descriptor instead.
func (*MessageWithMaps) Descriptor() ([]byte, []int) {
	return file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescGZIP(), []int{0}
}

func (x *MessageWithMaps) GetMapWithoutMessage() map[string]string {
	if x != nil {
		return x.MapWithoutMessage
	}
	return nil
}

func (x *MessageWithMaps) GetMapWithoutMessageB() map[uint32][]byte {
	if x != nil {
		return x.MapWithoutMessageB
	}
	return nil
}

func (x *MessageWithMaps) GetMapWithMessage() map[int64]*MessageWithMaps_NestedMessage {
	if x != nil {
		return x.MapWithMessage
	}
	return nil
}

func (x *MessageWithMaps) GetNestedMessage() *MessageWithMaps_NestedMessage {
	if x != nil {
		return x.NestedMessage
	}
	return nil
}

func (x *MessageWithMaps) GetRepeatedMessage() []*MessageWithMaps_NestedMessage {
	if x != nil {
		return x.RepeatedMessage
	}
	return nil
}

type MessageWithMaps_NestedMessage struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            *uint64                `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	Name          *string                `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *MessageWithMaps_NestedMessage) Reset() {
	*x = MessageWithMaps_NestedMessage{}
	mi := &file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *MessageWithMaps_NestedMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MessageWithMaps_NestedMessage) ProtoMessage() {}

func (x *MessageWithMaps_NestedMessage) ProtoReflect() protoreflect.Message {
	mi := &file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use MessageWithMaps_NestedMessage.ProtoReflect.Descriptor instead.
func (*MessageWithMaps_NestedMessage) Descriptor() ([]byte, []int) {
	return file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescGZIP(), []int{0, 3}
}

func (x *MessageWithMaps_NestedMessage) GetId() uint64 {
	if x != nil && x.Id != nil {
		return *x.Id
	}
	return 0
}

func (x *MessageWithMaps_NestedMessage) GetName() string {
	if x != nil && x.Name != nil {
		return *x.Name
	}
	return ""
}

var File_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto protoreflect.FileDescriptor

const file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc = "" +
	"\n" +
	"Acmd/protoc-gen-go/testdata/protoeditions/maps_and_delimited.proto\x12\x1cgoproto.protoc.protoeditions\"\xfc\x06\n" +
	"\x0fMessageWithMaps\x12t\n" +
	"\x13map_without_message\x18\x01 \x03(\v2D.goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageEntryR\x11mapWithoutMessage\x12x\n" +
	"\x15map_without_message_b\x18\x02 \x03(\v2E.goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageBEntryR\x12mapWithoutMessageB\x12k\n" +
	"\x10map_with_message\x18\x03 \x03(\v2A.goproto.protoc.protoeditions.MessageWithMaps.MapWithMessageEntryR\x0emapWithMessage\x12b\n" +
	"\x0enested_message\x18\x04 \x01(\v2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageR\rnestedMessage\x12f\n" +
	"\x10repeated_message\x18\x05 \x03(\v2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageR\x0frepeatedMessage\x1aD\n" +
	"\x16MapWithoutMessageEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1aE\n" +
	"\x17MapWithoutMessageBEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\rR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\fR\x05value:\x028\x01\x1a~\n" +
	"\x13MapWithMessageEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\x03R\x03key\x12Q\n" +
	"\x05value\x18\x02 \x01(\v2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageR\x05value:\x028\x01\x1a3\n" +
	"\rNestedMessage\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\x04R\x02id\x12\x12\n" +
	"\x04name\x18\x02 \x01(\tR\x04nameBJZCgoogle.golang.org/protobuf/cmd/protoc-gen-go/testdata/protoeditions\x92\x03\x02(\x02b\beditionsp\xe8\a"

var (
	file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescOnce sync.Once
	file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescData []byte
)

func file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescGZIP() []byte {
	file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescOnce.Do(func() {
		file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc)))
	})
	return file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescData
}

var file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_goTypes = []any{
	(*MessageWithMaps)(nil),               // 0: goproto.protoc.protoeditions.MessageWithMaps
	nil,                                   // 1: goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageEntry
	nil,                                   // 2: goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageBEntry
	nil,                                   // 3: goproto.protoc.protoeditions.MessageWithMaps.MapWithMessageEntry
	(*MessageWithMaps_NestedMessage)(nil), // 4: goproto.protoc.protoeditions.MessageWithMaps.NestedMessage
}
var file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_depIdxs = []int32{
	1, // 0: goproto.protoc.protoeditions.MessageWithMaps.map_without_message:type_name -> goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageEntry
	2, // 1: goproto.protoc.protoeditions.MessageWithMaps.map_without_message_b:type_name -> goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageBEntry
	3, // 2: goproto.protoc.protoeditions.MessageWithMaps.map_with_message:type_name -> goproto.protoc.protoeditions.MessageWithMaps.MapWithMessageEntry
	4, // 3: goproto.protoc.protoeditions.MessageWithMaps.nested_message:type_name -> goproto.protoc.protoeditions.MessageWithMaps.NestedMessage
	4, // 4: goproto.protoc.protoeditions.MessageWithMaps.repeated_message:type_name -> goproto.protoc.protoeditions.MessageWithMaps.NestedMessage
	4, // 5: goproto.protoc.protoeditions.MessageWithMaps.MapWithMessageEntry.value:type_name -> goproto.protoc.protoeditions.MessageWithMaps.NestedMessage
	6, // [6:6] is the sub-list for method output_type
	6, // [6:6] is the sub-list for method input_type
	6, // [6:6] is the sub-list for extension type_name
	6, // [6:6] is the sub-list for extension extendee
	0, // [0:6] is the sub-list for field type_name
}

func init() { file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_init() }
func file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_init() {
	if File_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_goTypes,
		DependencyIndexes: file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_depIdxs,
		MessageInfos:      file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_msgTypes,
	}.Build()
	File_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto = out.File
	file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_goTypes = nil
	file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_depIdxs = nil
}
