// 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 protoc-gen-go. DO NOT EDIT.
// source: cmd/protoc-gen-go/testdata/proto3/enum.proto

package proto3

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

type Enum int32

const (
	Enum_ZERO Enum = 0
	Enum_ONE  Enum = 1
	Enum_TWO  Enum = 2
)

// Enum value maps for Enum.
var (
	Enum_name = map[int32]string{
		0: "ZERO",
		1: "ONE",
		2: "TWO",
	}
	Enum_value = map[string]int32{
		"ZERO": 0,
		"ONE":  1,
		"TWO":  2,
	}
)

func (x Enum) Enum() *Enum {
	p := new(Enum)
	*p = x
	return p
}

func (x Enum) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Enum) Descriptor() protoreflect.EnumDescriptor {
	return file_cmd_protoc_gen_go_testdata_proto3_enum_proto_enumTypes[0].Descriptor()
}

func (Enum) Type() protoreflect.EnumType {
	return &file_cmd_protoc_gen_go_testdata_proto3_enum_proto_enumTypes[0]
}

func (x Enum) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Enum.Descriptor instead.
func (Enum) EnumDescriptor() ([]byte, []int) {
	return file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescGZIP(), []int{0}
}

var File_cmd_protoc_gen_go_testdata_proto3_enum_proto protoreflect.FileDescriptor

const file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDesc = "" +
	"\n" +
	",cmd/protoc-gen-go/testdata/proto3/enum.proto\x12\x15goproto.protoc.proto3*\"\n" +
	"\x04Enum\x12\b\n" +
	"\x04ZERO\x10\x00\x12\a\n" +
	"\x03ONE\x10\x01\x12\a\n" +
	"\x03TWO\x10\x02B>Z<google.golang.org/protobuf/cmd/protoc-gen-go/testdata/proto3b\x06proto3"

var (
	file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescOnce sync.Once
	file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescData []byte
)

func file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescGZIP() []byte {
	file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescOnce.Do(func() {
		file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDesc)))
	})
	return file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDescData
}

var file_cmd_protoc_gen_go_testdata_proto3_enum_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_cmd_protoc_gen_go_testdata_proto3_enum_proto_goTypes = []any{
	(Enum)(0), // 0: goproto.protoc.proto3.Enum
}
var file_cmd_protoc_gen_go_testdata_proto3_enum_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_cmd_protoc_gen_go_testdata_proto3_enum_proto_init() }
func file_cmd_protoc_gen_go_testdata_proto3_enum_proto_init() {
	if File_cmd_protoc_gen_go_testdata_proto3_enum_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_proto3_enum_proto_rawDesc), len(file_cmd_protoc_gen_go_testdata_proto3_enum_proto_rawDesc)),
			NumEnums:      1,
			NumMessages:   0,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cmd_protoc_gen_go_testdata_proto3_enum_proto_goTypes,
		DependencyIndexes: file_cmd_protoc_gen_go_testdata_proto3_enum_proto_depIdxs,
		EnumInfos:         file_cmd_protoc_gen_go_testdata_proto3_enum_proto_enumTypes,
	}.Build()
	File_cmd_protoc_gen_go_testdata_proto3_enum_proto = out.File
	file_cmd_protoc_gen_go_testdata_proto3_enum_proto_goTypes = nil
	file_cmd_protoc_gen_go_testdata_proto3_enum_proto_depIdxs = nil
}
