// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/region_code_error.proto

package errors

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Enum describing possible region code errors.
type RegionCodeErrorEnum_RegionCodeError int32

const (
	// Enum unspecified.
	RegionCodeErrorEnum_UNSPECIFIED RegionCodeErrorEnum_RegionCodeError = 0
	// The received error code is not known in this version.
	RegionCodeErrorEnum_UNKNOWN RegionCodeErrorEnum_RegionCodeError = 1
	// Invalid region code.
	RegionCodeErrorEnum_INVALID_REGION_CODE RegionCodeErrorEnum_RegionCodeError = 2
)

var RegionCodeErrorEnum_RegionCodeError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "INVALID_REGION_CODE",
}

var RegionCodeErrorEnum_RegionCodeError_value = map[string]int32{
	"UNSPECIFIED":         0,
	"UNKNOWN":             1,
	"INVALID_REGION_CODE": 2,
}

func (x RegionCodeErrorEnum_RegionCodeError) String() string {
	return proto.EnumName(RegionCodeErrorEnum_RegionCodeError_name, int32(x))
}

func (RegionCodeErrorEnum_RegionCodeError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_82b26e9ba20863ce, []int{0, 0}
}

// Container for enum describing possible region code errors.
type RegionCodeErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RegionCodeErrorEnum) Reset()         { *m = RegionCodeErrorEnum{} }
func (m *RegionCodeErrorEnum) String() string { return proto.CompactTextString(m) }
func (*RegionCodeErrorEnum) ProtoMessage()    {}
func (*RegionCodeErrorEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_82b26e9ba20863ce, []int{0}
}

func (m *RegionCodeErrorEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RegionCodeErrorEnum.Unmarshal(m, b)
}
func (m *RegionCodeErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RegionCodeErrorEnum.Marshal(b, m, deterministic)
}
func (m *RegionCodeErrorEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RegionCodeErrorEnum.Merge(m, src)
}
func (m *RegionCodeErrorEnum) XXX_Size() int {
	return xxx_messageInfo_RegionCodeErrorEnum.Size(m)
}
func (m *RegionCodeErrorEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_RegionCodeErrorEnum.DiscardUnknown(m)
}

var xxx_messageInfo_RegionCodeErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.RegionCodeErrorEnum_RegionCodeError", RegionCodeErrorEnum_RegionCodeError_name, RegionCodeErrorEnum_RegionCodeError_value)
	proto.RegisterType((*RegionCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.RegionCodeErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/region_code_error.proto", fileDescriptor_82b26e9ba20863ce)
}

var fileDescriptor_82b26e9ba20863ce = []byte{
	// 302 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0x03, 0x31,
	0x18, 0x85, 0xed, 0x08, 0x0a, 0xe9, 0xa2, 0x65, 0x2a, 0x08, 0x22, 0x5d, 0xcc, 0x01, 0x92, 0x45,
	0xc0, 0x45, 0x5c, 0xa5, 0x9d, 0x58, 0x07, 0x25, 0x2d, 0x95, 0x8e, 0x20, 0x03, 0xc3, 0xd8, 0x84,
	0x30, 0xd0, 0xe6, 0x2f, 0x49, 0xed, 0x81, 0x5c, 0x7a, 0x14, 0x8f, 0xe2, 0xc6, 0x2b, 0xc8, 0x4c,
	0x6c, 0x17, 0x05, 0x5d, 0xe5, 0xf1, 0xf8, 0xde, 0xcb, 0xe3, 0x47, 0x37, 0x06, 0xc0, 0xac, 0x34,
	0xa9, 0x94, 0x27, 0x41, 0x36, 0x6a, 0x47, 0x89, 0x76, 0x0e, 0x9c, 0x27, 0x4e, 0x9b, 0x1a, 0x6c,
	0xb9, 0x04, 0xa5, 0xcb, 0xd6, 0xc2, 0x1b, 0x07, 0x5b, 0x88, 0x87, 0x01, 0xc6, 0x95, 0xf2, 0xf8,
	0x90, 0xc3, 0x3b, 0x8a, 0x43, 0xee, 0xea, 0x7a, 0xdf, 0xbb, 0xa9, 0x49, 0x65, 0x2d, 0x6c, 0xab,
	0x6d, 0x0d, 0xd6, 0x87, 0x74, 0x52, 0xa2, 0xc1, 0xbc, 0x2d, 0x1e, 0x83, 0xd2, 0xa2, 0x49, 0x08,
	0xfb, 0xb6, 0x4e, 0xee, 0x51, 0xef, 0xc8, 0x8e, 0x7b, 0xa8, 0xbb, 0x90, 0x4f, 0x33, 0x31, 0xce,
	0xee, 0x32, 0x91, 0xf6, 0x4f, 0xe2, 0x2e, 0x3a, 0x5f, 0xc8, 0x07, 0x39, 0x7d, 0x96, 0xfd, 0x4e,
	0x7c, 0x89, 0x06, 0x99, 0xcc, 0xf9, 0x63, 0x96, 0x96, 0x73, 0x31, 0xc9, 0xa6, 0xb2, 0x1c, 0x4f,
	0x53, 0xd1, 0x8f, 0x46, 0xdf, 0x1d, 0x94, 0x2c, 0x61, 0x8d, 0xff, 0x5f, 0x39, 0xba, 0x38, 0xfa,
	0x6e, 0xd6, 0xac, 0x9b, 0x75, 0x5e, 0xd2, 0xdf, 0x9c, 0x81, 0x55, 0x65, 0x0d, 0x06, 0x67, 0x88,
	0xd1, 0xb6, 0xdd, 0xbe, 0xbf, 0xd2, 0xa6, 0xf6, 0x7f, 0x1d, 0xed, 0x36, 0x3c, 0xef, 0xd1, 0xe9,
	0x84, 0xf3, 0x8f, 0x68, 0x38, 0x09, 0x65, 0x5c, 0x79, 0x1c, 0x64, 0xa3, 0x72, 0x8a, 0xdb, 0x2f,
	0xfd, 0xe7, 0x1e, 0x28, 0xb8, 0xf2, 0xc5, 0x01, 0x28, 0x72, 0x5a, 0x04, 0xe0, 0x2b, 0x4a, 0x82,
	0xcb, 0x18, 0x57, 0x9e, 0xb1, 0x03, 0xc2, 0x58, 0x4e, 0x19, 0x0b, 0xd0, 0xeb, 0x59, 0xbb, 0x8e,
	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xd3, 0xa4, 0x21, 0xd1, 0x01, 0x00, 0x00,
}
