// 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/enums/keyword_plan_competition_level.proto

package enums

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

// Competition level of a keyword.
type KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel int32

const (
	// Not specified.
	KeywordPlanCompetitionLevelEnum_UNSPECIFIED KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 0
	// The value is unknown in this version.
	KeywordPlanCompetitionLevelEnum_UNKNOWN KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 1
	// Low competition. The Competition Index range for this is [0, 33].
	KeywordPlanCompetitionLevelEnum_LOW KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 2
	// Medium competition. The Competition Index range for this is [34, 66].
	KeywordPlanCompetitionLevelEnum_MEDIUM KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 3
	// High competition. The Competition Index range for this is [67, 100].
	KeywordPlanCompetitionLevelEnum_HIGH KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel = 4
)

// Enum value maps for KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel.
var (
	KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "LOW",
		3: "MEDIUM",
		4: "HIGH",
	}
	KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"LOW":         2,
		"MEDIUM":      3,
		"HIGH":        4,
	}
)

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

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

func (KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_enumTypes[0].Descriptor()
}

func (KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_enumTypes[0]
}

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

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

// Container for enumeration of keyword competition levels. The competition
// level indicates how competitive ad placement is for a keyword and
// is determined by the number of advertisers bidding on that keyword relative
// to all keywords across Google. The competition level can depend on the
// location and Search Network targeting options you've selected.
type KeywordPlanCompetitionLevelEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*KeywordPlanCompetitionLevelEnum) ProtoMessage() {}

func (x *KeywordPlanCompetitionLevelEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v2_enums_keyword_plan_competition_level_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 KeywordPlanCompetitionLevelEnum.ProtoReflect.Descriptor instead.
func (*KeywordPlanCompetitionLevelEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDesc = []byte{
	0x0a, 0x42, 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, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6d,
	0x70, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 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, 0x6e,
	0x75, 0x6d, 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, 0x7d, 0x0a, 0x1f, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x6c, 0x61, 0x6e,
	0x43, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c,
	0x45, 0x6e, 0x75, 0x6d, 0x22, 0x5a, 0x0a, 0x1b, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x50,
	0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65,
	0x76, 0x65, 0x6c, 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, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45,
	0x44, 0x49, 0x55, 0x4d, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x04,
	0x42, 0xf5, 0x01, 0x0a, 0x21, 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, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x20, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x50,
	0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65,
	0x76, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 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, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02,
	0x03, 0x47, 0x41, 0x41, 0xaa, 0x02, 0x1d, 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,
	0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02, 0x1d, 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,
	0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02, 0x21, 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, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescData = file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_goTypes = []interface{}{
	(KeywordPlanCompetitionLevelEnum_KeywordPlanCompetitionLevel)(0), // 0: google.ads.googleads.v2.enums.KeywordPlanCompetitionLevelEnum.KeywordPlanCompetitionLevel
	(*KeywordPlanCompetitionLevelEnum)(nil),                          // 1: google.ads.googleads.v2.enums.KeywordPlanCompetitionLevelEnum
}
var file_google_ads_googleads_v2_enums_keyword_plan_competition_level_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_enums_keyword_plan_competition_level_proto_init() }
func file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_init() {
	if File_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*KeywordPlanCompetitionLevelEnum); 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_enums_keyword_plan_competition_level_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto = out.File
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_keyword_plan_competition_level_proto_depIdxs = nil
}
