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

// A restriction used to determine if the request context's
// geo should be matched.
type GeoTargetingRestrictionEnum_GeoTargetingRestriction int32

const (
	// Not specified.
	GeoTargetingRestrictionEnum_UNSPECIFIED GeoTargetingRestrictionEnum_GeoTargetingRestriction = 0
	// Used for return value only. Represents value unknown in this version.
	GeoTargetingRestrictionEnum_UNKNOWN GeoTargetingRestrictionEnum_GeoTargetingRestriction = 1
	// Indicates that request context should match the physical location of
	// the user.
	GeoTargetingRestrictionEnum_LOCATION_OF_PRESENCE GeoTargetingRestrictionEnum_GeoTargetingRestriction = 2
)

// Enum value maps for GeoTargetingRestrictionEnum_GeoTargetingRestriction.
var (
	GeoTargetingRestrictionEnum_GeoTargetingRestriction_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "LOCATION_OF_PRESENCE",
	}
	GeoTargetingRestrictionEnum_GeoTargetingRestriction_value = map[string]int32{
		"UNSPECIFIED":          0,
		"UNKNOWN":              1,
		"LOCATION_OF_PRESENCE": 2,
	}
)

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

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

func (GeoTargetingRestrictionEnum_GeoTargetingRestriction) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_enumTypes[0].Descriptor()
}

func (GeoTargetingRestrictionEnum_GeoTargetingRestriction) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_enumTypes[0]
}

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

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

// Message describing feed item geo targeting restriction.
type GeoTargetingRestrictionEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*GeoTargetingRestrictionEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_geo_targeting_restriction_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDesc = []byte{
	0x0a, 0x3d, 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,
	0x67, 0x65, 0x6f, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65,
	0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x70, 0x0a, 0x1b,
	0x47, 0x65, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x74,
	0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x51, 0x0a, 0x17, 0x47,
	0x65, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x74, 0x72,
	0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e,
	0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x02, 0x42, 0xf1,
	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, 0x33, 0x2e, 0x65,
	0x6e, 0x75, 0x6d, 0x73, 0x42, 0x1c, 0x47, 0x65, 0x6f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69,
	0x6e, 0x67, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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_geo_targeting_restriction_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescData = file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_goTypes = []interface{}{
	(GeoTargetingRestrictionEnum_GeoTargetingRestriction)(0), // 0: google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum.GeoTargetingRestriction
	(*GeoTargetingRestrictionEnum)(nil),                      // 1: google.ads.googleads.v3.enums.GeoTargetingRestrictionEnum
}
var file_google_ads_googleads_v3_enums_geo_targeting_restriction_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_geo_targeting_restriction_proto_init() }
func file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_init() {
	if File_google_ads_googleads_v3_enums_geo_targeting_restriction_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GeoTargetingRestrictionEnum); 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_geo_targeting_restriction_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_geo_targeting_restriction_proto = out.File
	file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_geo_targeting_restriction_proto_depIdxs = nil
}
