// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/keyword_plan_campaign_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 errors from applying a keyword plan campaign.
type KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError int32

const (
	// Enum unspecified.
	KeywordPlanCampaignErrorEnum_UNSPECIFIED KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 0
	// The received error code is not known in this version.
	KeywordPlanCampaignErrorEnum_UNKNOWN KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 1
	// A keyword plan campaign name is missing, empty, longer than allowed limit
	// or contains invalid chars.
	KeywordPlanCampaignErrorEnum_INVALID_NAME KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 2
	// A keyword plan campaign contains one or more untargetable languages.
	KeywordPlanCampaignErrorEnum_INVALID_LANGUAGES KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 3
	// A keyword plan campaign contains one or more invalid geo targets.
	KeywordPlanCampaignErrorEnum_INVALID_GEOS KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 4
	// The keyword plan campaign name is duplicate to an existing keyword plan
	// campaign name or other keyword plan campaign name in the request.
	KeywordPlanCampaignErrorEnum_DUPLICATE_NAME KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 5
	// The number of geo targets in the keyword plan campaign exceeds limits.
	KeywordPlanCampaignErrorEnum_MAX_GEOS_EXCEEDED KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError = 6
)

var KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "INVALID_NAME",
	3: "INVALID_LANGUAGES",
	4: "INVALID_GEOS",
	5: "DUPLICATE_NAME",
	6: "MAX_GEOS_EXCEEDED",
}

var KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_value = map[string]int32{
	"UNSPECIFIED":       0,
	"UNKNOWN":           1,
	"INVALID_NAME":      2,
	"INVALID_LANGUAGES": 3,
	"INVALID_GEOS":      4,
	"DUPLICATE_NAME":    5,
	"MAX_GEOS_EXCEEDED": 6,
}

func (x KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError) String() string {
	return proto.EnumName(KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name, int32(x))
}

func (KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_919a79ad2f4c50d2, []int{0, 0}
}

// Container for enum describing possible errors from applying a keyword plan
// campaign.
type KeywordPlanCampaignErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanCampaignErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError", KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_name, KeywordPlanCampaignErrorEnum_KeywordPlanCampaignError_value)
	proto.RegisterType((*KeywordPlanCampaignErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanCampaignErrorEnum")
}

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

var fileDescriptor_919a79ad2f4c50d2 = []byte{
	// 366 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x4e, 0xab, 0x40,
	0x18, 0x85, 0x2f, 0xf4, 0xde, 0xde, 0x64, 0x7a, 0x73, 0x45, 0x12, 0x13, 0x63, 0x6a, 0x17, 0x3c,
	0xc0, 0xb0, 0x60, 0x37, 0x6e, 0x9c, 0xc2, 0x48, 0x48, 0x5b, 0x4a, 0x52, 0xc1, 0xc6, 0x90, 0x90,
	0xb1, 0x10, 0x42, 0xa4, 0x33, 0x84, 0xa9, 0x35, 0xbe, 0x8c, 0x0b, 0x97, 0xbe, 0x84, 0x7b, 0x1f,
	0xc5, 0x27, 0x70, 0x69, 0x60, 0x4a, 0xe3, 0xa6, 0xae, 0x38, 0xf9, 0xf9, 0xce, 0x39, 0xf0, 0xff,
	0xe0, 0x32, 0xe7, 0x3c, 0x2f, 0x33, 0x93, 0xa6, 0xc2, 0x94, 0xb2, 0x51, 0x5b, 0xcb, 0xcc, 0xea,
	0x9a, 0xd7, 0xc2, 0xbc, 0xcf, 0x9e, 0x1e, 0x79, 0x9d, 0x26, 0x55, 0x49, 0x59, 0xb2, 0xa2, 0xeb,
	0x8a, 0x16, 0x39, 0x4b, 0xda, 0x97, 0xb0, 0xaa, 0xf9, 0x86, 0xeb, 0x23, 0x69, 0x83, 0x34, 0x15,
	0x70, 0x9f, 0x00, 0xb7, 0x16, 0x94, 0x09, 0x67, 0xc3, 0xae, 0xa1, 0x2a, 0x4c, 0xca, 0x18, 0xdf,
	0xd0, 0x4d, 0xc1, 0x99, 0x90, 0x6e, 0xe3, 0x4d, 0x01, 0xc3, 0x89, 0xec, 0x08, 0x4a, 0xca, 0xec,
	0x5d, 0x03, 0x69, 0xbc, 0x84, 0x3d, 0xac, 0x8d, 0x67, 0x05, 0x9c, 0x1e, 0x02, 0xf4, 0x23, 0x30,
	0x08, 0xfd, 0x45, 0x40, 0x6c, 0xef, 0xca, 0x23, 0x8e, 0xf6, 0x4b, 0x1f, 0x80, 0xbf, 0xa1, 0x3f,
	0xf1, 0xe7, 0x37, 0xbe, 0xa6, 0xe8, 0x1a, 0xf8, 0xe7, 0xf9, 0x11, 0x9e, 0x7a, 0x4e, 0xe2, 0xe3,
	0x19, 0xd1, 0x54, 0xfd, 0x04, 0x1c, 0x77, 0x93, 0x29, 0xf6, 0xdd, 0x10, 0xbb, 0x64, 0xa1, 0xf5,
	0xbe, 0x83, 0x2e, 0x99, 0x2f, 0xb4, 0xdf, 0xba, 0x0e, 0xfe, 0x3b, 0x61, 0x30, 0xf5, 0x6c, 0x7c,
	0x4d, 0xa4, 0xf9, 0x4f, 0x63, 0x9e, 0xe1, 0x65, 0x4b, 0x24, 0x64, 0x69, 0x13, 0xe2, 0x10, 0x47,
	0xeb, 0x8f, 0x3f, 0x15, 0x60, 0xac, 0xf8, 0x1a, 0xfe, 0xbc, 0x86, 0xf1, 0xf9, 0xa1, 0x9f, 0x08,
	0x9a, 0x3d, 0x04, 0xca, 0xad, 0xb3, 0x0b, 0xc8, 0x79, 0x49, 0x59, 0x0e, 0x79, 0x9d, 0x9b, 0x79,
	0xc6, 0xda, 0x2d, 0x75, 0x97, 0xa9, 0x0a, 0x71, 0xe8, 0x50, 0x17, 0xf2, 0xf1, 0xa2, 0xf6, 0x5c,
	0x8c, 0x5f, 0xd5, 0x91, 0x2b, 0xc3, 0x70, 0x2a, 0xa0, 0x94, 0x8d, 0x8a, 0x2c, 0xd8, 0x56, 0x8a,
	0xf7, 0x0e, 0x88, 0x71, 0x2a, 0xe2, 0x3d, 0x10, 0x47, 0x56, 0x2c, 0x81, 0x0f, 0xd5, 0x90, 0x53,
	0x84, 0x70, 0x2a, 0x10, 0xda, 0x23, 0x08, 0x45, 0x16, 0x42, 0x12, 0xba, 0xeb, 0xb7, 0x5f, 0x67,
	0x7d, 0x05, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xd2, 0x49, 0x66, 0x45, 0x02, 0x00, 0x00,
}
