// 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/v3/enums/policy_topic_evidence_destination_not_working_device.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 evidence destination not working devices.
type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice int32

const (
	// No value has been specified.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNSPECIFIED PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_UNKNOWN PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 1
	// Landing page doesn't work on desktop device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_DESKTOP PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 2
	// Landing page doesn't work on Android device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_ANDROID PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 3
	// Landing page doesn't work on iOS device.
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_IOS PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice = 4
)

// Enum value maps for PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice.
var (
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "DESKTOP",
		3: "ANDROID",
		4: "IOS",
	}
	PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"DESKTOP":     2,
		"ANDROID":     3,
		"IOS":         4,
	}
)

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

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

func (PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_enumTypes[0].Descriptor()
}

func (PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_enumTypes[0]
}

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

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

// Container for enum describing possible policy topic evidence destination not
// working devices.
type PolicyTopicEvidenceDestinationNotWorkingDeviceEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDesc = []byte{
	0x0a, 0x58, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x65, 0x76, 0x69,
	0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65,
	0x76, 0x69, 0x63, 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, 0x33, 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, 0xa7, 0x01, 0x0a, 0x32, 0x50, 0x6f, 0x6c, 0x69,
	0x63, 0x79, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x44,
	0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x57, 0x6f, 0x72,
	0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x71,
	0x0a, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x69,
	0x64, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x4e, 0x6f, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 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, 0x0b,
	0x0a, 0x07, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x41,
	0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10,
	0x04, 0x42, 0x88, 0x02, 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,
	0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x33, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54,
	0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x73, 0x74,
	0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x69, 0x6e,
	0x67, 0x44, 0x65, 0x76, 0x69, 0x63, 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, 0x33, 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, 0x33, 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, 0x33, 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, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescData = file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_goTypes = []interface{}{
	(PolicyTopicEvidenceDestinationNotWorkingDeviceEnum_PolicyTopicEvidenceDestinationNotWorkingDevice)(0), // 0: google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum.PolicyTopicEvidenceDestinationNotWorkingDevice
	(*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum)(nil),                                             // 1: google.ads.googleads.v3.enums.PolicyTopicEvidenceDestinationNotWorkingDeviceEnum
}
var file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_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_v3_enums_policy_topic_evidence_destination_not_working_device_proto_init()
}
func file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_init() {
	if File_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PolicyTopicEvidenceDestinationNotWorkingDeviceEnum); 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_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto = out.File
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_policy_topic_evidence_destination_not_working_device_proto_depIdxs = nil
}
