// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/geo_target_constant_suggestion_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 geo target constant suggestion errors.
type GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError int32

const (
	// Enum unspecified.
	GeoTargetConstantSuggestionErrorEnum_UNSPECIFIED GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 0
	// The received error code is not known in this version.
	GeoTargetConstantSuggestionErrorEnum_UNKNOWN GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 1
	// A location name cannot be greater than 300 characters.
	GeoTargetConstantSuggestionErrorEnum_LOCATION_NAME_SIZE_LIMIT GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 2
	// At most 25 location names can be specified in a SuggestGeoTargetConstants
	// method.
	GeoTargetConstantSuggestionErrorEnum_LOCATION_NAME_LIMIT GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 3
	// The country code is invalid.
	GeoTargetConstantSuggestionErrorEnum_INVALID_COUNTRY_CODE GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 4
	// Geo target constant resource names or location names must be provided in
	// the request.
	GeoTargetConstantSuggestionErrorEnum_REQUEST_PARAMETERS_UNSET GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError = 5
)

var GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "LOCATION_NAME_SIZE_LIMIT",
	3: "LOCATION_NAME_LIMIT",
	4: "INVALID_COUNTRY_CODE",
	5: "REQUEST_PARAMETERS_UNSET",
}

var GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_value = map[string]int32{
	"UNSPECIFIED":              0,
	"UNKNOWN":                  1,
	"LOCATION_NAME_SIZE_LIMIT": 2,
	"LOCATION_NAME_LIMIT":      3,
	"INVALID_COUNTRY_CODE":     4,
	"REQUEST_PARAMETERS_UNSET": 5,
}

func (x GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError) String() string {
	return proto.EnumName(GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name, int32(x))
}

func (GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_15abcc5da870aafb, []int{0, 0}
}

// Container for enum describing possible geo target constant suggestion errors.
type GeoTargetConstantSuggestionErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GeoTargetConstantSuggestionErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError", GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_name, GeoTargetConstantSuggestionErrorEnum_GeoTargetConstantSuggestionError_value)
	proto.RegisterType((*GeoTargetConstantSuggestionErrorEnum)(nil), "google.ads.googleads.v3.errors.GeoTargetConstantSuggestionErrorEnum")
}

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

var fileDescriptor_15abcc5da870aafb = []byte{
	// 386 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcf, 0xaa, 0xd4, 0x30,
	0x14, 0xc6, 0x6d, 0xaf, 0x7f, 0x20, 0x77, 0x61, 0xa9, 0x82, 0x17, 0xb9, 0x0c, 0x52, 0x74, 0x9b,
	0x2e, 0xba, 0x8b, 0xab, 0x4c, 0x1b, 0x87, 0xe0, 0x4c, 0x5a, 0xfb, 0x4f, 0x1c, 0x0a, 0xa1, 0x4e,
	0x4b, 0x18, 0x98, 0x49, 0x86, 0xa6, 0x33, 0x6b, 0x9f, 0xc5, 0xa5, 0x1b, 0xdf, 0xc3, 0x27, 0xf0,
	0x19, 0x7c, 0x0a, 0x69, 0x33, 0x53, 0x70, 0xe1, 0x9d, 0x55, 0x3e, 0x72, 0xbe, 0xf3, 0xfb, 0x92,
	0x73, 0x00, 0x15, 0x4a, 0x89, 0x5d, 0xeb, 0xd7, 0x8d, 0xf6, 0x8d, 0x1c, 0xd4, 0x29, 0xf0, 0xdb,
	0xae, 0x53, 0x9d, 0xf6, 0x45, 0xab, 0x78, 0x5f, 0x77, 0xa2, 0xed, 0xf9, 0x46, 0x49, 0xdd, 0xd7,
	0xb2, 0xe7, 0xfa, 0x28, 0x44, 0xab, 0xfb, 0xad, 0x92, 0x7c, 0x74, 0xc1, 0x43, 0xa7, 0x7a, 0xe5,
	0xce, 0x4c, 0x3f, 0xac, 0x1b, 0x0d, 0x27, 0x14, 0x3c, 0x05, 0xd0, 0xa0, 0x5e, 0xdf, 0x5f, 0xa2,
	0x0e, 0x5b, 0xbf, 0x96, 0x52, 0xf5, 0xf5, 0x80, 0xd0, 0xa6, 0xdb, 0xfb, 0x6d, 0x81, 0xb7, 0x8b,
	0x56, 0xe5, 0x63, 0x56, 0x78, 0x8e, 0xca, 0xa6, 0x24, 0x32, 0x30, 0x88, 0x3c, 0xee, 0xbd, 0x9f,
	0x16, 0x78, 0x73, 0xcd, 0xe8, 0x3e, 0x07, 0xb7, 0x05, 0xcb, 0x12, 0x12, 0xd2, 0x0f, 0x94, 0x44,
	0xce, 0x23, 0xf7, 0x16, 0x3c, 0x2b, 0xd8, 0x47, 0x16, 0x7f, 0x66, 0x8e, 0xe5, 0xde, 0x83, 0xbb,
	0x65, 0x1c, 0xe2, 0x9c, 0xc6, 0x8c, 0x33, 0xbc, 0x22, 0x3c, 0xa3, 0x6b, 0xc2, 0x97, 0x74, 0x45,
	0x73, 0xc7, 0x76, 0x5f, 0x81, 0x17, 0xff, 0x56, 0x4d, 0xe1, 0xc6, 0xbd, 0x03, 0x2f, 0x29, 0x2b,
	0xf1, 0x92, 0x46, 0x3c, 0x8c, 0x0b, 0x96, 0xa7, 0x5f, 0x78, 0x18, 0x47, 0xc4, 0x79, 0x3c, 0x00,
	0x53, 0xf2, 0xa9, 0x20, 0x59, 0xce, 0x13, 0x9c, 0xe2, 0x15, 0xc9, 0x49, 0x9a, 0xf1, 0x82, 0x65,
	0x24, 0x77, 0x9e, 0xcc, 0xbf, 0xd9, 0xc0, 0xdb, 0xa8, 0x3d, 0x7c, 0x78, 0x3e, 0xf3, 0x77, 0xd7,
	0x7e, 0x95, 0x0c, 0x83, 0x4a, 0xac, 0x75, 0x74, 0x06, 0x09, 0xb5, 0xab, 0xa5, 0x80, 0xaa, 0x13,
	0xbe, 0x68, 0xe5, 0x38, 0xc6, 0xcb, 0x0e, 0x0f, 0x5b, 0xfd, 0xbf, 0x95, 0xbe, 0x37, 0xc7, 0x77,
	0xfb, 0x66, 0x81, 0xf1, 0x0f, 0x7b, 0xb6, 0x30, 0x30, 0xdc, 0x68, 0x68, 0xe4, 0xa0, 0xca, 0x00,
	0x8e, 0x91, 0xfa, 0xd7, 0xc5, 0x50, 0xe1, 0x46, 0x57, 0x93, 0xa1, 0x2a, 0x83, 0xca, 0x18, 0xfe,
	0xd8, 0x9e, 0xb9, 0x45, 0x08, 0x37, 0x1a, 0xa1, 0xc9, 0x82, 0x50, 0x19, 0x20, 0x64, 0x4c, 0x5f,
	0x9f, 0x8e, 0xaf, 0x0b, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x0a, 0x60, 0x53, 0x5d, 0x6f, 0x02,
	0x00, 0x00,
}
