// 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/policy_topic_entry_type.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

// The possible policy topic entry types.
type PolicyTopicEntryTypeEnum_PolicyTopicEntryType int32

const (
	// No value has been specified.
	PolicyTopicEntryTypeEnum_UNSPECIFIED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	PolicyTopicEntryTypeEnum_UNKNOWN PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 1
	// The resource will not be served.
	PolicyTopicEntryTypeEnum_PROHIBITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 2
	// The resource will not be served under some circumstances.
	PolicyTopicEntryTypeEnum_LIMITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 4
	// The resource cannot serve at all because of the current targeting
	// criteria.
	PolicyTopicEntryTypeEnum_FULLY_LIMITED PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 8
	// May be of interest, but does not limit how the resource is served.
	PolicyTopicEntryTypeEnum_DESCRIPTIVE PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 5
	// Could increase coverage beyond normal.
	PolicyTopicEntryTypeEnum_BROADENING PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 6
	// Constrained for all targeted countries, but may serve in other countries
	// through area of interest.
	PolicyTopicEntryTypeEnum_AREA_OF_INTEREST_ONLY PolicyTopicEntryTypeEnum_PolicyTopicEntryType = 7
)

// Enum value maps for PolicyTopicEntryTypeEnum_PolicyTopicEntryType.
var (
	PolicyTopicEntryTypeEnum_PolicyTopicEntryType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "PROHIBITED",
		4: "LIMITED",
		8: "FULLY_LIMITED",
		5: "DESCRIPTIVE",
		6: "BROADENING",
		7: "AREA_OF_INTEREST_ONLY",
	}
	PolicyTopicEntryTypeEnum_PolicyTopicEntryType_value = map[string]int32{
		"UNSPECIFIED":           0,
		"UNKNOWN":               1,
		"PROHIBITED":            2,
		"LIMITED":               4,
		"FULLY_LIMITED":         8,
		"DESCRIPTIVE":           5,
		"BROADENING":            6,
		"AREA_OF_INTEREST_ONLY": 7,
	}
)

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

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

func (PolicyTopicEntryTypeEnum_PolicyTopicEntryType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_enumTypes[0].Descriptor()
}

func (PolicyTopicEntryTypeEnum_PolicyTopicEntryType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_enumTypes[0]
}

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

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

// Container for enum describing possible policy topic entry types.
type PolicyTopicEntryTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*PolicyTopicEntryTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_policy_topic_entry_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDesc = []byte{
	0x0a, 0x3b, 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,
	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x65, 0x6e, 0x74,
	0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 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, 0xbd, 0x01, 0x0a, 0x18, 0x50,
	0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54,
	0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0xa0, 0x01, 0x0a, 0x14, 0x50, 0x6f, 0x6c, 0x69,
	0x63, 0x79, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65,
	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, 0x0e,
	0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x48, 0x49, 0x42, 0x49, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b,
	0x0a, 0x07, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x46,
	0x55, 0x4c, 0x4c, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x0f,
	0x0a, 0x0b, 0x44, 0x45, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12,
	0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x4f, 0x41, 0x44, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12,
	0x19, 0x0a, 0x15, 0x41, 0x52, 0x45, 0x41, 0x5f, 0x4f, 0x46, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52,
	0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x07, 0x42, 0xee, 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, 0x19, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 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_policy_topic_entry_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescData = file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_goTypes = []interface{}{
	(PolicyTopicEntryTypeEnum_PolicyTopicEntryType)(0), // 0: google.ads.googleads.v2.enums.PolicyTopicEntryTypeEnum.PolicyTopicEntryType
	(*PolicyTopicEntryTypeEnum)(nil),                   // 1: google.ads.googleads.v2.enums.PolicyTopicEntryTypeEnum
}
var file_google_ads_googleads_v2_enums_policy_topic_entry_type_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_policy_topic_entry_type_proto_init() }
func file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_init() {
	if File_google_ads_googleads_v2_enums_policy_topic_entry_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PolicyTopicEntryTypeEnum); 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_policy_topic_entry_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_policy_topic_entry_type_proto = out.File
	file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_policy_topic_entry_type_proto_depIdxs = nil
}
