// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v2/errors/keyword_plan_negative_keyword_error.proto

package errors

import (
	reflect "reflect"
	sync "sync"

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

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// 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
)

// Enum value maps for KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError.
var (
	KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
	}
	KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
	}
)

func (x KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) Enum() *KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError {
	p := new(KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError)
	*p = x
	return p
}

func (x KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_enumTypes[0].Descriptor()
}

func (KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_enumTypes[0]
}

func (x KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError.Descriptor instead.
func (KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing possible errors from applying a keyword plan
// negative keyword.
type KeywordPlanNegativeKeywordErrorEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *KeywordPlanNegativeKeywordErrorEnum) Reset() {
	*x = KeywordPlanNegativeKeywordErrorEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *KeywordPlanNegativeKeywordErrorEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*KeywordPlanNegativeKeywordErrorEnum) ProtoMessage() {}

func (x *KeywordPlanNegativeKeywordErrorEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use KeywordPlanNegativeKeywordErrorEnum.ProtoReflect.Descriptor instead.
func (*KeywordPlanNegativeKeywordErrorEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDesc = []byte{
	0x0a, 0x48, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
	0x2f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6e, 0x65,
	0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x65,
	0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73,
	0x2e, 0x76, 0x32, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x23, 0x4b, 0x65, 0x79, 0x77,
	0x6f, 0x72, 0x64, 0x50, 0x6c, 0x61, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4b,
	0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x6e, 0x75, 0x6d, 0x22,
	0x3f, 0x0a, 0x1f, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x6c, 0x61, 0x6e, 0x4e, 0x65,
	0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x45, 0x72, 0x72,
	0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
	0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01,
	0x42, 0xff, 0x01, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x32,
	0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x24, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
	0x50, 0x6c, 0x61, 0x6e, 0x4e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x4b, 0x65, 0x79, 0x77,
	0x6f, 0x72, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a,
	0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x3b, 0x65,
	0x72, 0x72, 0x6f, 0x72, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02, 0x1e, 0x47, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41,
	0x64, 0x73, 0x2e, 0x56, 0x32, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xca, 0x02, 0x1e, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x41, 0x64, 0x73, 0x5c, 0x56, 0x32, 0x5c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xea, 0x02, 0x22,
	0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x32, 0x3a, 0x3a, 0x45, 0x72, 0x72, 0x6f,
	0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescData = file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDesc
)

func file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDescData
}

var file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_goTypes = []interface{}{
	(KeywordPlanNegativeKeywordErrorEnum_KeywordPlanNegativeKeywordError)(0), // 0: google.ads.googleads.v2.errors.KeywordPlanNegativeKeywordErrorEnum.KeywordPlanNegativeKeywordError
	(*KeywordPlanNegativeKeywordErrorEnum)(nil),                              // 1: google.ads.googleads.v2.errors.KeywordPlanNegativeKeywordErrorEnum
}
var file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_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_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_init() }
func file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_init() {
	if File_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*KeywordPlanNegativeKeywordErrorEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto = out.File
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_rawDesc = nil
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_goTypes = nil
	file_google_ads_googleads_v2_errors_keyword_plan_negative_keyword_error_proto_depIdxs = nil
}
