// 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/v1/enums/location_extension_targeting_criterion_field.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

// Possible values for Location Extension Targeting criterion fields.
type LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField int32

const (
	// Not specified.
	LocationExtensionTargetingCriterionFieldEnum_UNSPECIFIED LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 0
	// Used for return value only. Represents value unknown in this version.
	LocationExtensionTargetingCriterionFieldEnum_UNKNOWN LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 1
	// Data Type: STRING. Line 1 of the business address.
	LocationExtensionTargetingCriterionFieldEnum_ADDRESS_LINE_1 LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 2
	// Data Type: STRING. Line 2 of the business address.
	LocationExtensionTargetingCriterionFieldEnum_ADDRESS_LINE_2 LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 3
	// Data Type: STRING. City of the business address.
	LocationExtensionTargetingCriterionFieldEnum_CITY LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 4
	// Data Type: STRING. Province of the business address.
	LocationExtensionTargetingCriterionFieldEnum_PROVINCE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 5
	// Data Type: STRING. Postal code of the business address.
	LocationExtensionTargetingCriterionFieldEnum_POSTAL_CODE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 6
	// Data Type: STRING. Country code of the business address.
	LocationExtensionTargetingCriterionFieldEnum_COUNTRY_CODE LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField = 7
)

// Enum value maps for LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField.
var (
	LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "ADDRESS_LINE_1",
		3: "ADDRESS_LINE_2",
		4: "CITY",
		5: "PROVINCE",
		6: "POSTAL_CODE",
		7: "COUNTRY_CODE",
	}
	LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField_value = map[string]int32{
		"UNSPECIFIED":    0,
		"UNKNOWN":        1,
		"ADDRESS_LINE_1": 2,
		"ADDRESS_LINE_2": 3,
		"CITY":           4,
		"PROVINCE":       5,
		"POSTAL_CODE":    6,
		"COUNTRY_CODE":   7,
	}
)

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

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

func (LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_enumTypes[0].Descriptor()
}

func (LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_enumTypes[0]
}

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

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

// Values for Location Extension Targeting criterion fields.
type LocationExtensionTargetingCriterionFieldEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*LocationExtensionTargetingCriterionFieldEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDesc = []byte{
	0x0a, 0x50, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
	0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x69,
	0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 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, 0x31, 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,
	0xdc, 0x01, 0x0a, 0x2c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65,
	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x72,
	0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x75, 0x6d,
	0x22, 0xab, 0x01, 0x0a, 0x28, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74,
	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x43,
	0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 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, 0x12, 0x0a, 0x0e, 0x41,
	0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x31, 0x10, 0x02, 0x12,
	0x12, 0x0a, 0x0e, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f,
	0x32, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x0c, 0x0a,
	0x08, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x4e, 0x43, 0x45, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x50,
	0x4f, 0x53, 0x54, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c,
	0x43, 0x4f, 0x55, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x07, 0x42, 0x82,
	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, 0x31, 0x2e, 0x65,
	0x6e, 0x75, 0x6d, 0x73, 0x42, 0x2d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78,
	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67,
	0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 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, 0x31, 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, 0x31, 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, 0x31, 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, 0x31, 0x3a, 0x3a, 0x45, 0x6e,
	0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescData = file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_goTypes = []interface{}{
	(LocationExtensionTargetingCriterionFieldEnum_LocationExtensionTargetingCriterionField)(0), // 0: google.ads.googleads.v1.enums.LocationExtensionTargetingCriterionFieldEnum.LocationExtensionTargetingCriterionField
	(*LocationExtensionTargetingCriterionFieldEnum)(nil),                                       // 1: google.ads.googleads.v1.enums.LocationExtensionTargetingCriterionFieldEnum
}
var file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_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_v1_enums_location_extension_targeting_criterion_field_proto_init()
}
func file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_init() {
	if File_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationExtensionTargetingCriterionFieldEnum); 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_v1_enums_location_extension_targeting_criterion_field_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto = out.File
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_location_extension_targeting_criterion_field_proto_depIdxs = nil
}
