// 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/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_v1_enums_listing_custom_attribute_index_proto_enumTypes[0].Descriptor()
}

func (ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_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_v1_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_v1_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_v1_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_v1_enums_listing_custom_attribute_index_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_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, 0x31, 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, 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, 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, 0x31, 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, 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_listing_custom_attribute_index_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescData = file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_goTypes = []interface{}{
	(ListingCustomAttributeIndexEnum_ListingCustomAttributeIndex)(0), // 0: google.ads.googleads.v1.enums.ListingCustomAttributeIndexEnum.ListingCustomAttributeIndex
	(*ListingCustomAttributeIndexEnum)(nil),                          // 1: google.ads.googleads.v1.enums.ListingCustomAttributeIndexEnum
}
var file_google_ads_googleads_v1_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_v1_enums_listing_custom_attribute_index_proto_init() }
func file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_init() {
	if File_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_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_v1_enums_listing_custom_attribute_index_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto = out.File
	file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_listing_custom_attribute_index_proto_depIdxs = nil
}
