// 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"
)

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 = "\nAcmd/protoc-gen-go/testdata/protoeditions/maps_and_delimited.protogoproto.protoc.protoeditions\"\xfc\nMessageWithMapst\nmap_without_message (2D.goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageEntryRmapWithoutMessagex\nmap_without_message_b (2E.goproto.protoc.protoeditions.MessageWithMaps.MapWithoutMessageBEntryRmapWithoutMessageBk\nmap_with_message (2A.goproto.protoc.protoeditions.MessageWithMaps.MapWithMessageEntryRmapWithMessageb\nnested_message (2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageR\rnestedMessagef\nrepeated_message (2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageRrepeatedMessageD\nMapWithoutMessageEntry\nkey (	Rkey\nvalue (	Rvalue:8E\nMapWithoutMessageBEntry\nkey (\rRkey\nvalue (Rvalue:8~\nMapWithMessageEntry\nkey (RkeyQ\nvalue (2;.goproto.protoc.protoeditions.MessageWithMaps.NestedMessageRvalue:83\n\rNestedMessage\nid (Rid\nname (	RnameBJZCgoogle.golang.org/protobuf/cmd/protoc-gen-go/testdata/protoeditions\x92(beditionsp\xe8"

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 = file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDesc
)

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 = string(protoimpl.X.CompressGZIP([]byte(file_cmd_protoc_gen_go_testdata_protoeditions_maps_and_delimited_proto_rawDescData)))
	})
	return []byte(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: []byte(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
}
