// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/keyword_plan_negative_keyword_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 negative
// keyword.
type KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError int32

const (
	// Enum unspecified.
	KeywordPlanNegativeKeywordErrorEnum_UNSPECIFIED KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError = 0
	// The received error code is not known in this version.
	KeywordPlanNegativeKeywordErrorEnum_UNKNOWN KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError = 1
)

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

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

func (x KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) String() string {
	return proto.EnumName(KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name, int32(x))
}

func (KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1d72670cdea957a8, []int{0, 0}
}

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

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

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

var xxx_messageInfo_KeywordPlanNegativeKeywordErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError", KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name, KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_value)
	proto.RegisterType((*KeywordPlanNegativeKeywordErrorEnum)(nil), "google.ads.googleads.v3.errors.KeywordPlanNegativeKeywordErrorEnum")
}

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

var fileDescriptor_1d72670cdea957a8 = []byte{
	// 296 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x41, 0x4b, 0xc3, 0x30,
	0x18, 0x86, 0xdd, 0x04, 0x85, 0xec, 0xe0, 0xe8, 0x51, 0x64, 0x42, 0xf5, 0x9c, 0x1c, 0x72, 0x8b,
	0x07, 0xe9, 0x5c, 0x9d, 0x63, 0x50, 0x0b, 0xb2, 0x0a, 0x52, 0x28, 0xd1, 0xc4, 0x50, 0xec, 0x92,
	0x92, 0xd4, 0x8a, 0x7f, 0xc7, 0xa3, 0x3f, 0xc5, 0x9f, 0xe2, 0x9f, 0x50, 0xda, 0xaf, 0xed, 0x4d,
	0x77, 0xca, 0xcb, 0xc7, 0xf3, 0xbd, 0xef, 0x9b, 0x0f, 0xdd, 0x28, 0x63, 0x54, 0x21, 0x09, 0x17,
	0x8e, 0x80, 0x6c, 0x54, 0x4d, 0x89, 0xb4, 0xd6, 0x58, 0x47, 0x5e, 0xe4, 0xfb, 0x9b, 0xb1, 0x22,
	0x2b, 0x0b, 0xae, 0x33, 0x2d, 0x15, 0xaf, 0xf2, 0x5a, 0x66, 0xfd, 0xb4, 0x85, 0x70, 0x69, 0x4d,
	0x65, 0xbc, 0x19, 0xac, 0x63, 0x2e, 0x1c, 0x1e, 0x9c, 0x70, 0x4d, 0x31, 0x38, 0x1d, 0x9f, 0xf4,
	0x49, 0x65, 0x4e, 0xb8, 0xd6, 0xa6, 0xe2, 0x55, 0x6e, 0xb4, 0x83, 0x6d, 0xff, 0x19, 0x9d, 0xad,
	0xc1, 0x34, 0x2e, 0xb8, 0x8e, 0xba, 0xa0, 0x6e, 0x14, 0x36, 0x0e, 0xa1, 0x7e, 0xdd, 0xfa, 0x97,
	0xe8, 0x74, 0x07, 0xe6, 0x1d, 0xa1, 0xc9, 0x26, 0xba, 0x8b, 0xc3, 0xab, 0xd5, 0xf5, 0x2a, 0x5c,
	0x4c, 0xf7, 0xbc, 0x09, 0x3a, 0xdc, 0x44, 0xeb, 0xe8, 0xf6, 0x3e, 0x9a, 0x8e, 0xe6, 0x3f, 0x23,
	0xe4, 0x3f, 0x99, 0x2d, 0xfe, 0xbf, 0xec, 0xfc, 0x7c, 0x47, 0x4a, 0xdc, 0x94, 0x8e, 0x47, 0x0f,
	0x8b, 0xce, 0x47, 0x99, 0x82, 0x6b, 0x85, 0x8d, 0x55, 0x44, 0x49, 0xdd, 0x7e, 0xa9, 0x3f, 0x67,
	0x99, 0xbb, 0xbf, 0xae, 0x7b, 0x01, 0xcf, 0xc7, 0x78, 0x7f, 0x19, 0x04, 0x9f, 0xe3, 0xd9, 0x12,
	0xcc, 0x02, 0xe1, 0x30, 0xc8, 0x46, 0x25, 0x14, 0xb7, 0x91, 0xee, 0xab, 0x07, 0xd2, 0x40, 0xb8,
	0x74, 0x00, 0xd2, 0x84, 0xa6, 0x00, 0x7c, 0x8f, 0x7d, 0x98, 0x32, 0x16, 0x08, 0xc7, 0xd8, 0x80,
	0x30, 0x96, 0x50, 0xc6, 0x00, 0x7a, 0x3c, 0x68, 0xdb, 0xd1, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff,
	0x8a, 0x92, 0x1d, 0x9d, 0xfa, 0x01, 0x00, 0x00,
}
