// 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/v2/enums/listing_group_type.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 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
)

// Enum value maps for ListingGroupTypeEnum_ListingGroupType.
var (
	ListingGroupTypeEnum_ListingGroupType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "SUBDIVISION",
		3: "UNIT",
	}
	ListingGroupTypeEnum_ListingGroupType_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"SUBDIVISION": 2,
		"UNIT":        3,
	}
)

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

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

func (ListingGroupTypeEnum_ListingGroupType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_listing_group_type_proto_enumTypes[0].Descriptor()
}

func (ListingGroupTypeEnum_ListingGroupType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_listing_group_type_proto_enumTypes[0]
}

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

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

// Container for enum describing the type of the listing group.
type ListingGroupTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ListingGroupTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_listing_group_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDesc = []byte{
	0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79,
	0x70, 0x65, 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,
	0x32, 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, 0x63, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67,
	0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x4b, 0x0a,
	0x10, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70,
	0x65, 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,
	0x0f, 0x0a, 0x0b, 0x53, 0x55, 0x42, 0x44, 0x49, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x02,
	0x12, 0x08, 0x0a, 0x04, 0x55, 0x4e, 0x49, 0x54, 0x10, 0x03, 0x42, 0xea, 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, 0x32, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73,
	0x42, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79,
	0x70, 0x65, 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,
	0x32, 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, 0x32, 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, 0x32, 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, 0x32,
	0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescData = file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_listing_group_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_listing_group_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_listing_group_type_proto_goTypes = []interface{}{
	(ListingGroupTypeEnum_ListingGroupType)(0), // 0: google.ads.googleads.v2.enums.ListingGroupTypeEnum.ListingGroupType
	(*ListingGroupTypeEnum)(nil),               // 1: google.ads.googleads.v2.enums.ListingGroupTypeEnum
}
var file_google_ads_googleads_v2_enums_listing_group_type_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_v2_enums_listing_group_type_proto_init() }
func file_google_ads_googleads_v2_enums_listing_group_type_proto_init() {
	if File_google_ads_googleads_v2_enums_listing_group_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_listing_group_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListingGroupTypeEnum); 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_v2_enums_listing_group_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_listing_group_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_listing_group_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_listing_group_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_listing_group_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_listing_group_type_proto = out.File
	file_google_ads_googleads_v2_enums_listing_group_type_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_listing_group_type_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_listing_group_type_proto_depIdxs = nil
}
