// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/listing_group_type.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 type of the listing group.
type ListingGroupTypeEnum_ListingGroupType int32

const (
	// Not specified.
	ListingGroupTypeEnum_UNSPECIFIED ListingGroupTypeEnum_ListingGroupType = 0
	// Used for return value only. Represents value unknown in this version.
	ListingGroupTypeEnum_UNKNOWN ListingGroupTypeEnum_ListingGroupType = 1
	// Subdivision of products along some listing dimension. These nodes
	// are not used by serving to target listing entries, but is purely
	// to define the structure of the tree.
	ListingGroupTypeEnum_SUBDIVISION ListingGroupTypeEnum_ListingGroupType = 2
	// Listing group unit that defines a bid.
	ListingGroupTypeEnum_UNIT ListingGroupTypeEnum_ListingGroupType = 3
)

var ListingGroupTypeEnum_ListingGroupType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "SUBDIVISION",
	3: "UNIT",
}

var ListingGroupTypeEnum_ListingGroupType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"SUBDIVISION": 2,
	"UNIT":        3,
}

func (x ListingGroupTypeEnum_ListingGroupType) String() string {
	return proto.EnumName(ListingGroupTypeEnum_ListingGroupType_name, int32(x))
}

func (ListingGroupTypeEnum_ListingGroupType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ee9f45bd9f5ee097, []int{0, 0}
}

// Container for enum describing the type of the listing group.
type ListingGroupTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListingGroupTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ListingGroupTypeEnum_ListingGroupType", ListingGroupTypeEnum_ListingGroupType_name, ListingGroupTypeEnum_ListingGroupType_value)
	proto.RegisterType((*ListingGroupTypeEnum)(nil), "google.ads.googleads.v3.enums.ListingGroupTypeEnum")
}

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

var fileDescriptor_ee9f45bd9f5ee097 = []byte{
	// 308 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4b, 0xfb, 0x30,
	0x18, 0xfe, 0xad, 0xfb, 0xa1, 0x92, 0x1d, 0x2c, 0x45, 0x2f, 0xe2, 0x0e, 0xdb, 0x07, 0x48, 0x0e,
	0x01, 0x0f, 0xf1, 0xd4, 0xba, 0x39, 0xc2, 0x24, 0x1b, 0x6c, 0xad, 0x20, 0x85, 0x51, 0xd7, 0x12,
	0x0a, 0x5b, 0x12, 0x9a, 0x76, 0xb0, 0xaf, 0xe3, 0xd1, 0x8f, 0xe2, 0x47, 0xd9, 0xa7, 0x90, 0x24,
	0xb6, 0x87, 0x81, 0x5e, 0xc2, 0xc3, 0xfb, 0xfc, 0xc9, 0xf3, 0xbe, 0xe0, 0x81, 0x4b, 0xc9, 0x77,
	0x05, 0xca, 0x72, 0x8d, 0x1c, 0x34, 0xe8, 0x80, 0x51, 0x21, 0x9a, 0xbd, 0x46, 0xbb, 0x52, 0xd7,
	0xa5, 0xe0, 0x1b, 0x5e, 0xc9, 0x46, 0x6d, 0xea, 0xa3, 0x2a, 0xa0, 0xaa, 0x64, 0x2d, 0x83, 0xa1,
	0x13, 0xc3, 0x2c, 0xd7, 0xb0, 0xf3, 0xc1, 0x03, 0x86, 0xd6, 0x77, 0x77, 0xdf, 0xc6, 0xaa, 0x12,
	0x65, 0x42, 0xc8, 0x3a, 0xab, 0x4b, 0x29, 0xb4, 0x33, 0x8f, 0xb7, 0xe0, 0xe6, 0xc5, 0x05, 0xcf,
	0x4c, 0xee, 0xfa, 0xa8, 0x8a, 0xa9, 0x68, 0xf6, 0xe3, 0x39, 0xf0, 0xcf, 0xe7, 0xc1, 0x35, 0x18,
	0xc4, 0x6c, 0xb5, 0x9c, 0x3e, 0xd1, 0x67, 0x3a, 0x9d, 0xf8, 0xff, 0x82, 0x01, 0xb8, 0x8c, 0xd9,
	0x9c, 0x2d, 0x5e, 0x99, 0xdf, 0x33, 0xec, 0x2a, 0x8e, 0x26, 0x34, 0xa1, 0x2b, 0xba, 0x60, 0xbe,
	0x17, 0x5c, 0x81, 0xff, 0x31, 0xa3, 0x6b, 0xbf, 0x1f, 0x9d, 0x7a, 0x60, 0xb4, 0x95, 0x7b, 0xf8,
	0x67, 0xd1, 0xe8, 0xf6, 0xfc, 0xc3, 0xa5, 0x69, 0xb8, 0xec, 0xbd, 0x45, 0x3f, 0x3e, 0x2e, 0x77,
	0x99, 0xe0, 0x50, 0x56, 0x1c, 0xf1, 0x42, 0xd8, 0xfe, 0xed, 0xa1, 0x54, 0xa9, 0x7f, 0xb9, 0xdb,
	0xa3, 0x7d, 0x3f, 0xbc, 0xfe, 0x2c, 0x0c, 0x3f, 0xbd, 0xe1, 0xcc, 0x45, 0x85, 0xb9, 0x86, 0x0e,
	0x1a, 0x94, 0x60, 0x68, 0x96, 0xd6, 0x5f, 0x2d, 0x9f, 0x86, 0xb9, 0x4e, 0x3b, 0x3e, 0x4d, 0x70,
	0x6a, 0xf9, 0x93, 0x37, 0x72, 0x43, 0x42, 0xc2, 0x5c, 0x13, 0xd2, 0x29, 0x08, 0x49, 0x30, 0x21,
	0x56, 0xf3, 0x7e, 0x61, 0x8b, 0xe1, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x45, 0x49, 0xb6, 0x11,
	0xcf, 0x01, 0x00, 0x00,
}
