// 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_group_radius_units.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 unit of radius distance in location group (e.g. MILES)
type LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits int32

const (
	// Not specified.
	LocationGroupRadiusUnitsEnum_UNSPECIFIED LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 0
	// Used for return value only. Represents value unknown in this version.
	LocationGroupRadiusUnitsEnum_UNKNOWN LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 1
	// Meters
	LocationGroupRadiusUnitsEnum_METERS LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 2
	// Miles
	LocationGroupRadiusUnitsEnum_MILES LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits = 3
)

// Enum value maps for LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits.
var (
	LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "METERS",
		3: "MILES",
	}
	LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"METERS":      2,
		"MILES":       3,
	}
)

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

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

func (LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_location_group_radius_units_proto_enumTypes[0].Descriptor()
}

func (LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_location_group_radius_units_proto_enumTypes[0]
}

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

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

// Container for enum describing unit of radius in location group.
type LocationGroupRadiusUnitsEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*LocationGroupRadiusUnitsEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_location_group_radius_units_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDesc = []byte{
	0x0a, 0x3f, 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, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72,
	0x61, 0x64, 0x69, 0x75, 0x73, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x73, 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, 0x6f,
	0x0a, 0x1c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
	0x61, 0x64, 0x69, 0x75, 0x73, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x4f,
	0x0a, 0x18, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52,
	0x61, 0x64, 0x69, 0x75, 0x73, 0x55, 0x6e, 0x69, 0x74, 0x73, 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, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x54, 0x45,
	0x52, 0x53, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x49, 0x4c, 0x45, 0x53, 0x10, 0x03, 0x42,
	0xf2, 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, 0x31, 0x2e,
	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x1d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x55, 0x6e, 0x69, 0x74, 0x73, 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_group_radius_units_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescData = file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_location_group_radius_units_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_location_group_radius_units_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_location_group_radius_units_proto_goTypes = []interface{}{
	(LocationGroupRadiusUnitsEnum_LocationGroupRadiusUnits)(0), // 0: google.ads.googleads.v1.enums.LocationGroupRadiusUnitsEnum.LocationGroupRadiusUnits
	(*LocationGroupRadiusUnitsEnum)(nil),                       // 1: google.ads.googleads.v1.enums.LocationGroupRadiusUnitsEnum
}
var file_google_ads_googleads_v1_enums_location_group_radius_units_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_group_radius_units_proto_init() }
func file_google_ads_googleads_v1_enums_location_group_radius_units_proto_init() {
	if File_google_ads_googleads_v1_enums_location_group_radius_units_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_location_group_radius_units_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationGroupRadiusUnitsEnum); 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_group_radius_units_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_location_group_radius_units_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_location_group_radius_units_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_location_group_radius_units_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_location_group_radius_units_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_location_group_radius_units_proto = out.File
	file_google_ads_googleads_v1_enums_location_group_radius_units_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_location_group_radius_units_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_location_group_radius_units_proto_depIdxs = nil
}
