// 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/product_custom_attribute_index.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 index of the product custom attribute.
type ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex int32

const (
	// Not specified.
	ProductCustomAttributeIndexEnum_UNSPECIFIED ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 0
	// Used for return value only. Represents value unknown in this version.
	ProductCustomAttributeIndexEnum_UNKNOWN ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 1
	// First product custom attribute.
	ProductCustomAttributeIndexEnum_INDEX0 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 7
	// Second product custom attribute.
	ProductCustomAttributeIndexEnum_INDEX1 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 8
	// Third product custom attribute.
	ProductCustomAttributeIndexEnum_INDEX2 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 9
	// Fourth product custom attribute.
	ProductCustomAttributeIndexEnum_INDEX3 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 10
	// Fifth product custom attribute.
	ProductCustomAttributeIndexEnum_INDEX4 ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex = 11
)

// Enum value maps for ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex.
var (
	ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		7:  "INDEX0",
		8:  "INDEX1",
		9:  "INDEX2",
		10: "INDEX3",
		11: "INDEX4",
	}
	ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"INDEX0":      7,
		"INDEX1":      8,
		"INDEX2":      9,
		"INDEX3":      10,
		"INDEX4":      11,
	}
)

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

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

func (ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_enumTypes[0].Descriptor()
}

func (ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_enumTypes[0]
}

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

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

// Container for enum describing the index of the product custom attribute.
type ProductCustomAttributeIndexEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ProductCustomAttributeIndexEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_product_custom_attribute_index_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDesc = []byte{
	0x0a, 0x42, 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, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x61,
	0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 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, 0x9a, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x75, 0x73,
	0x74, 0x6f, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65,
	0x78, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x77, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
	0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x49,
	0x6e, 0x64, 0x65, 0x78, 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, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x30, 0x10, 0x07, 0x12, 0x0a,
	0x0a, 0x06, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x31, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e,
	0x44, 0x45, 0x58, 0x32, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x33,
	0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x34, 0x10, 0x0b, 0x42, 0xf5,
	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, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x43, 0x75, 0x73,
	0x74, 0x6f, 0x6d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65,
	0x78, 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_product_custom_attribute_index_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescData = file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_goTypes = []interface{}{
	(ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex)(0), // 0: google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum.ProductCustomAttributeIndex
	(*ProductCustomAttributeIndexEnum)(nil),                          // 1: google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum
}
var file_google_ads_googleads_v3_enums_product_custom_attribute_index_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_product_custom_attribute_index_proto_init() }
func file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_init() {
	if File_google_ads_googleads_v3_enums_product_custom_attribute_index_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProductCustomAttributeIndexEnum); 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_product_custom_attribute_index_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_product_custom_attribute_index_proto = out.File
	file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_product_custom_attribute_index_proto_depIdxs = nil
}
