// 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/price_extension_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

// Price extension type.
type PriceExtensionTypeEnum_PriceExtensionType int32

const (
	// Not specified.
	PriceExtensionTypeEnum_UNSPECIFIED PriceExtensionTypeEnum_PriceExtensionType = 0
	// Used for return value only. Represents value unknown in this version.
	PriceExtensionTypeEnum_UNKNOWN PriceExtensionTypeEnum_PriceExtensionType = 1
	// The type for showing a list of brands.
	PriceExtensionTypeEnum_BRANDS PriceExtensionTypeEnum_PriceExtensionType = 2
	// The type for showing a list of events.
	PriceExtensionTypeEnum_EVENTS PriceExtensionTypeEnum_PriceExtensionType = 3
	// The type for showing locations relevant to your business.
	PriceExtensionTypeEnum_LOCATIONS PriceExtensionTypeEnum_PriceExtensionType = 4
	// The type for showing sub-regions or districts within a city or region.
	PriceExtensionTypeEnum_NEIGHBORHOODS PriceExtensionTypeEnum_PriceExtensionType = 5
	// The type for showing a collection of product categories.
	PriceExtensionTypeEnum_PRODUCT_CATEGORIES PriceExtensionTypeEnum_PriceExtensionType = 6
	// The type for showing a collection of related product tiers.
	PriceExtensionTypeEnum_PRODUCT_TIERS PriceExtensionTypeEnum_PriceExtensionType = 7
	// The type for showing a collection of services offered by your business.
	PriceExtensionTypeEnum_SERVICES PriceExtensionTypeEnum_PriceExtensionType = 8
	// The type for showing a collection of service categories.
	PriceExtensionTypeEnum_SERVICE_CATEGORIES PriceExtensionTypeEnum_PriceExtensionType = 9
	// The type for showing a collection of related service tiers.
	PriceExtensionTypeEnum_SERVICE_TIERS PriceExtensionTypeEnum_PriceExtensionType = 10
)

// Enum value maps for PriceExtensionTypeEnum_PriceExtensionType.
var (
	PriceExtensionTypeEnum_PriceExtensionType_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		2:  "BRANDS",
		3:  "EVENTS",
		4:  "LOCATIONS",
		5:  "NEIGHBORHOODS",
		6:  "PRODUCT_CATEGORIES",
		7:  "PRODUCT_TIERS",
		8:  "SERVICES",
		9:  "SERVICE_CATEGORIES",
		10: "SERVICE_TIERS",
	}
	PriceExtensionTypeEnum_PriceExtensionType_value = map[string]int32{
		"UNSPECIFIED":        0,
		"UNKNOWN":            1,
		"BRANDS":             2,
		"EVENTS":             3,
		"LOCATIONS":          4,
		"NEIGHBORHOODS":      5,
		"PRODUCT_CATEGORIES": 6,
		"PRODUCT_TIERS":      7,
		"SERVICES":           8,
		"SERVICE_CATEGORIES": 9,
		"SERVICE_TIERS":      10,
	}
)

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

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

func (PriceExtensionTypeEnum_PriceExtensionType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_price_extension_type_proto_enumTypes[0].Descriptor()
}

func (PriceExtensionTypeEnum_PriceExtensionType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_price_extension_type_proto_enumTypes[0]
}

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

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

// Container for enum describing types for a price extension.
type PriceExtensionTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*PriceExtensionTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_price_extension_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDesc = []byte{
	0x0a, 0x38, 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, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 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, 0xeb, 0x01, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x63,
	0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e,
	0x75, 0x6d, 0x22, 0xd0, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65,
	0x6e, 0x73, 0x69, 0x6f, 0x6e, 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, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x41, 0x4e, 0x44,
	0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x03, 0x12,
	0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x04, 0x12, 0x11,
	0x0a, 0x0d, 0x4e, 0x45, 0x49, 0x47, 0x48, 0x42, 0x4f, 0x52, 0x48, 0x4f, 0x4f, 0x44, 0x53, 0x10,
	0x05, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x43, 0x41, 0x54,
	0x45, 0x47, 0x4f, 0x52, 0x49, 0x45, 0x53, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f,
	0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x53, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08,
	0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45,
	0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x49, 0x45, 0x53,
	0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49,
	0x45, 0x52, 0x53, 0x10, 0x0a, 0x42, 0xec, 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, 0x17, 0x50, 0x72, 0x69,
	0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 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_price_extension_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescData = file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_price_extension_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_price_extension_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_price_extension_type_proto_goTypes = []interface{}{
	(PriceExtensionTypeEnum_PriceExtensionType)(0), // 0: google.ads.googleads.v2.enums.PriceExtensionTypeEnum.PriceExtensionType
	(*PriceExtensionTypeEnum)(nil),                 // 1: google.ads.googleads.v2.enums.PriceExtensionTypeEnum
}
var file_google_ads_googleads_v2_enums_price_extension_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_price_extension_type_proto_init() }
func file_google_ads_googleads_v2_enums_price_extension_type_proto_init() {
	if File_google_ads_googleads_v2_enums_price_extension_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_price_extension_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PriceExtensionTypeEnum); 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_price_extension_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_price_extension_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_price_extension_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_price_extension_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_price_extension_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_price_extension_type_proto = out.File
	file_google_ads_googleads_v2_enums_price_extension_type_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_price_extension_type_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_price_extension_type_proto_depIdxs = nil
}
