// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/product_custom_attribute_index.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

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

var ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name = map[int32]string{
	0:  "UNSPECIFIED",
	1:  "UNKNOWN",
	7:  "INDEX0",
	8:  "INDEX1",
	9:  "INDEX2",
	10: "INDEX3",
	11: "INDEX4",
}

var ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"INDEX0":      7,
	"INDEX1":      8,
	"INDEX2":      9,
	"INDEX3":      10,
	"INDEX4":      11,
}

func (x ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) String() string {
	return proto.EnumName(ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name, int32(x))
}

func (ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_80f002e0af7a25fd, []int{0, 0}
}

// Container for enum describing the index of the product custom attribute.
type ProductCustomAttributeIndexEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ProductCustomAttributeIndexEnum) Reset()         { *m = ProductCustomAttributeIndexEnum{} }
func (m *ProductCustomAttributeIndexEnum) String() string { return proto.CompactTextString(m) }
func (*ProductCustomAttributeIndexEnum) ProtoMessage()    {}
func (*ProductCustomAttributeIndexEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_80f002e0af7a25fd, []int{0}
}

func (m *ProductCustomAttributeIndexEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Unmarshal(m, b)
}
func (m *ProductCustomAttributeIndexEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Marshal(b, m, deterministic)
}
func (m *ProductCustomAttributeIndexEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ProductCustomAttributeIndexEnum.Merge(m, src)
}
func (m *ProductCustomAttributeIndexEnum) XXX_Size() int {
	return xxx_messageInfo_ProductCustomAttributeIndexEnum.Size(m)
}
func (m *ProductCustomAttributeIndexEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_ProductCustomAttributeIndexEnum.DiscardUnknown(m)
}

var xxx_messageInfo_ProductCustomAttributeIndexEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex", ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_name, ProductCustomAttributeIndexEnum_ProductCustomAttributeIndex_value)
	proto.RegisterType((*ProductCustomAttributeIndexEnum)(nil), "google.ads.googleads.v3.enums.ProductCustomAttributeIndexEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/product_custom_attribute_index.proto", fileDescriptor_80f002e0af7a25fd)
}

var fileDescriptor_80f002e0af7a25fd = []byte{
	// 327 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xb1, 0x4e, 0xf3, 0x30,
	0x14, 0x85, 0xff, 0xf4, 0x97, 0x5a, 0x70, 0x07, 0xac, 0x8c, 0x40, 0x05, 0xed, 0x03, 0x38, 0x80,
	0x99, 0xcc, 0x94, 0xb6, 0xa1, 0x8a, 0x90, 0x42, 0x24, 0xd4, 0x82, 0x50, 0xa4, 0x2a, 0xad, 0x23,
	0x2b, 0x52, 0x63, 0x47, 0xb1, 0x53, 0x78, 0x16, 0x46, 0x46, 0x1e, 0x85, 0x47, 0x61, 0x67, 0x47,
	0xb1, 0x89, 0x37, 0xb2, 0x44, 0x9f, 0x72, 0xef, 0x3d, 0xe7, 0xde, 0x63, 0x30, 0x65, 0x42, 0xb0,
	0x5d, 0xe6, 0xa5, 0x54, 0x7a, 0x06, 0x1b, 0xda, 0x63, 0x2f, 0xe3, 0x75, 0x21, 0xbd, 0xb2, 0x12,
	0xb4, 0xde, 0xaa, 0xf5, 0xb6, 0x96, 0x4a, 0x14, 0xeb, 0x54, 0xa9, 0x2a, 0xdf, 0xd4, 0x2a, 0x5b,
	0xe7, 0x9c, 0x66, 0xaf, 0xa8, 0xac, 0x84, 0x12, 0xee, 0xc8, 0x0c, 0xa2, 0x94, 0x4a, 0x64, 0x35,
	0xd0, 0x1e, 0x23, 0xad, 0x71, 0x7c, 0xda, 0x5a, 0x94, 0xb9, 0x97, 0x72, 0x2e, 0x54, 0xaa, 0x72,
	0xc1, 0xa5, 0x19, 0x9e, 0xbc, 0x39, 0xe0, 0x2c, 0x36, 0x2e, 0x33, 0x6d, 0xe2, 0xb7, 0x1e, 0x61,
	0x63, 0x11, 0xf0, 0xba, 0x98, 0xbc, 0x80, 0x93, 0x8e, 0x16, 0xf7, 0x08, 0x0c, 0x97, 0xd1, 0x43,
	0x1c, 0xcc, 0xc2, 0xdb, 0x30, 0x98, 0xc3, 0x7f, 0xee, 0x10, 0x0c, 0x96, 0xd1, 0x5d, 0x74, 0xff,
	0x18, 0x41, 0xc7, 0x05, 0xa0, 0x1f, 0x46, 0xf3, 0xe0, 0xe9, 0x02, 0x0e, 0x2c, 0x5f, 0xc2, 0x03,
	0xcb, 0x57, 0xf0, 0xd0, 0x32, 0x86, 0xc0, 0xf2, 0x35, 0x1c, 0x4e, 0xbf, 0x1d, 0x30, 0xde, 0x8a,
	0x02, 0x75, 0x1e, 0x38, 0x3d, 0xef, 0x58, 0x2e, 0x6e, 0x8e, 0x8c, 0x9d, 0xe7, 0xdf, 0x9c, 0x11,
	0x13, 0xbb, 0x94, 0x33, 0x24, 0x2a, 0xe6, 0xb1, 0x8c, 0xeb, 0x08, 0xda, 0xdc, 0xcb, 0x5c, 0xfe,
	0xf1, 0x0c, 0x37, 0xfa, 0xfb, 0xde, 0xfb, 0xbf, 0xf0, 0xfd, 0x8f, 0xde, 0x68, 0x61, 0xa4, 0x7c,
	0x2a, 0x91, 0xc1, 0x86, 0x56, 0x18, 0x35, 0x59, 0xc9, 0xcf, 0xb6, 0x9e, 0xf8, 0x54, 0x26, 0xb6,
	0x9e, 0xac, 0x70, 0xa2, 0xeb, 0x5f, 0xbd, 0xb1, 0xf9, 0x49, 0x88, 0x4f, 0x25, 0x21, 0xb6, 0x83,
	0x90, 0x15, 0x26, 0x44, 0xf7, 0x6c, 0xfa, 0x7a, 0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb1,
	0xf0, 0x6e, 0xe3, 0x1e, 0x02, 0x00, 0x00,
}
