// Copyright 2021 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: internal/testprotos/enums/enums.proto

package enums

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_DEFAULT     Enum = 1337
	Enum_ZERO        Enum = 0
	Enum_ONE         Enum = 1
	Enum_ELEVENT     Enum = 11
	Enum_SEVENTEEN   Enum = 17
	Enum_THIRTYSEVEN Enum = 37
	Enum_SIXTYSEVEN  Enum = 67
	Enum_NEGATIVE    Enum = -1
)

// Enum value maps for Enum.
var (
	Enum_name = map[int32]string{
		1337: "DEFAULT",
		0:    "ZERO",
		1:    "ONE",
		11:   "ELEVENT",
		17:   "SEVENTEEN",
		37:   "THIRTYSEVEN",
		67:   "SIXTYSEVEN",
		-1:   "NEGATIVE",
	}
	Enum_value = map[string]int32{
		"DEFAULT":     1337,
		"ZERO":        0,
		"ONE":         1,
		"ELEVENT":     11,
		"SEVENTEEN":   17,
		"THIRTYSEVEN": 37,
		"SIXTYSEVEN":  67,
		"NEGATIVE":    -1,
	}
)

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_internal_testprotos_enums_enums_proto_enumTypes[0].Descriptor()
}

func (Enum) Type() protoreflect.EnumType {
	return &file_internal_testprotos_enums_enums_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_internal_testprotos_enums_enums_proto_rawDescGZIP(), []int{0}
}

var File_internal_testprotos_enums_enums_proto protoreflect.FileDescriptor

const file_internal_testprotos_enums_enums_proto_rawDesc = "" +
	"\n" +
	"%internal/testprotos/enums/enums.proto\x12\x13goproto.proto.enums*{\n" +
	"\x04Enum\x12\f\n" +
	"\aDEFAULT\x10\xb9\n" +
	"\x12\b\n" +
	"\x04ZERO\x10\x00\x12\a\n" +
	"\x03ONE\x10\x01\x12\v\n" +
	"\aELEVENT\x10\v\x12\r\n" +
	"\tSEVENTEEN\x10\x11\x12\x0f\n" +
	"\vTHIRTYSEVEN\x10%\x12\x0e\n" +
	"\n" +
	"SIXTYSEVEN\x10C\x12\x15\n" +
	"\bNEGATIVE\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01B;Z4google.golang.org/protobuf/internal/testprotos/enums\x92\x03\x02\x10\x02b\beditionsp\xe8\a"

var (
	file_internal_testprotos_enums_enums_proto_rawDescOnce sync.Once
	file_internal_testprotos_enums_enums_proto_rawDescData []byte
)

func file_internal_testprotos_enums_enums_proto_rawDescGZIP() []byte {
	file_internal_testprotos_enums_enums_proto_rawDescOnce.Do(func() {
		file_internal_testprotos_enums_enums_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_internal_testprotos_enums_enums_proto_rawDesc), len(file_internal_testprotos_enums_enums_proto_rawDesc)))
	})
	return file_internal_testprotos_enums_enums_proto_rawDescData
}

var file_internal_testprotos_enums_enums_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_internal_testprotos_enums_enums_proto_goTypes = []any{
	(Enum)(0), // 0: goproto.proto.enums.Enum
}
var file_internal_testprotos_enums_enums_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_internal_testprotos_enums_enums_proto_init() }
func file_internal_testprotos_enums_enums_proto_init() {
	if File_internal_testprotos_enums_enums_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_enums_enums_proto_rawDesc), len(file_internal_testprotos_enums_enums_proto_rawDesc)),
			NumEnums:      1,
			NumMessages:   0,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_enums_enums_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_enums_enums_proto_depIdxs,
		EnumInfos:         file_internal_testprotos_enums_enums_proto_enumTypes,
	}.Build()
	File_internal_testprotos_enums_enums_proto = out.File
	file_internal_testprotos_enums_enums_proto_goTypes = nil
	file_internal_testprotos_enums_enums_proto_depIdxs = nil
}
