// Copyright 2019 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/listing_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 listing custom attribute.
type ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex int32

const (
	// Not specified.
	ListingCustomAttributeIndexEnum_UNSPECIFIED ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 0
	// Used for return value only. Represents value unknown in this version.
	ListingCustomAttributeIndexEnum_UNKNOWN ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 1
	// First listing custom attribute.
	ListingCustomAttributeIndexEnum_INDEX0 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 7
	// Second listing custom attribute.
	ListingCustomAttributeIndexEnum_INDEX1 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 8
	// Third listing custom attribute.
	ListingCustomAttributeIndexEnum_INDEX2 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 9
	// Fourth listing custom attribute.
	ListingCustomAttributeIndexEnum_INDEX3 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 10
	// Fifth listing custom attribute.
	ListingCustomAttributeIndexEnum_INDEX4 ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex = 11
)

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

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

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

func (ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_enumTypes[0].Descriptor()
}

func (ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_enumTypes[0]
}

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

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

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

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

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

func (*ListingCustomAttributeIndexEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_listing_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,
	0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 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, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 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, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67,
	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, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 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_listing_custom_attribute_index_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescData = file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_goTypes = []interface{}{
	(ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex)(0), // 0: google.ads.googleads.v3.enums.ListingCustomAttributeIndexEnum.ListingCustomAttributeIndex
	(*ListingCustomAttributeIndexEnum)(nil),                          // 1: google.ads.googleads.v3.enums.ListingCustomAttributeIndexEnum
}
var file_google_ads_googleads_v3_enums_listing_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_listing_custom_attribute_index_proto_init() }
func file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_init() {
	if File_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListingCustomAttributeIndexEnum); 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_listing_custom_attribute_index_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto = out.File
	file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_listing_custom_attribute_index_proto_depIdxs = nil
}
