// 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/v3/enums/user_list_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

// Enum containing possible user list types.
type UserListTypeEnum_UserListType int32

const (
	// Not specified.
	UserListTypeEnum_UNSPECIFIED UserListTypeEnum_UserListType = 0
	// Used for return value only. Represents value unknown in this version.
	UserListTypeEnum_UNKNOWN UserListTypeEnum_UserListType = 1
	// UserList represented as a collection of conversion types.
	UserListTypeEnum_REMARKETING UserListTypeEnum_UserListType = 2
	// UserList represented as a combination of other user lists/interests.
	UserListTypeEnum_LOGICAL UserListTypeEnum_UserListType = 3
	// UserList created in the Google Ad Manager platform.
	UserListTypeEnum_EXTERNAL_REMARKETING UserListTypeEnum_UserListType = 4
	// UserList associated with a rule.
	UserListTypeEnum_RULE_BASED UserListTypeEnum_UserListType = 5
	// UserList with users similar to users of another UserList.
	UserListTypeEnum_SIMILAR UserListTypeEnum_UserListType = 6
	// UserList of first-party CRM data provided by advertiser in the form of
	// emails or other formats.
	UserListTypeEnum_CRM_BASED UserListTypeEnum_UserListType = 7
)

// Enum value maps for UserListTypeEnum_UserListType.
var (
	UserListTypeEnum_UserListType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "REMARKETING",
		3: "LOGICAL",
		4: "EXTERNAL_REMARKETING",
		5: "RULE_BASED",
		6: "SIMILAR",
		7: "CRM_BASED",
	}
	UserListTypeEnum_UserListType_value = map[string]int32{
		"UNSPECIFIED":          0,
		"UNKNOWN":              1,
		"REMARKETING":          2,
		"LOGICAL":              3,
		"EXTERNAL_REMARKETING": 4,
		"RULE_BASED":           5,
		"SIMILAR":              6,
		"CRM_BASED":            7,
	}
)

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

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

func (UserListTypeEnum_UserListType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_user_list_type_proto_enumTypes[0].Descriptor()
}

func (UserListTypeEnum_UserListType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_user_list_type_proto_enumTypes[0]
}

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

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

// The user list types.
type UserListTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*UserListTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_user_list_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_user_list_type_proto_rawDesc = []byte{
	0x0a, 0x32, 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,
	0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 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, 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, 0xa5, 0x01, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79,
	0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x4c,
	0x69, 0x73, 0x74, 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, 0x52, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x45,
	0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41,
	0x4c, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f,
	0x52, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0e, 0x0a,
	0x0a, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0b, 0x0a,
	0x07, 0x53, 0x49, 0x4d, 0x49, 0x4c, 0x41, 0x52, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52,
	0x4d, 0x5f, 0x42, 0x41, 0x53, 0x45, 0x44, 0x10, 0x07, 0x42, 0xe6, 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,
	0x11, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 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, 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_user_list_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescData = file_google_ads_googleads_v3_enums_user_list_type_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_user_list_type_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_user_list_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_user_list_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_user_list_type_proto_goTypes = []interface{}{
	(UserListTypeEnum_UserListType)(0), // 0: google.ads.googleads.v3.enums.UserListTypeEnum.UserListType
	(*UserListTypeEnum)(nil),           // 1: google.ads.googleads.v3.enums.UserListTypeEnum
}
var file_google_ads_googleads_v3_enums_user_list_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_v3_enums_user_list_type_proto_init() }
func file_google_ads_googleads_v3_enums_user_list_type_proto_init() {
	if File_google_ads_googleads_v3_enums_user_list_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_user_list_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserListTypeEnum); 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_user_list_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_user_list_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_user_list_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_user_list_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_user_list_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_user_list_type_proto = out.File
	file_google_ads_googleads_v3_enums_user_list_type_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_user_list_type_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_user_list_type_proto_depIdxs = nil
}
