// 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/user_list_membership_status.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 membership statuses.
type UserListMembershipStatusEnum_UserListMembershipStatus int32

const (
	// Not specified.
	UserListMembershipStatusEnum_UNSPECIFIED UserListMembershipStatusEnum_UserListMembershipStatus = 0
	// Used for return value only. Represents value unknown in this version.
	UserListMembershipStatusEnum_UNKNOWN UserListMembershipStatusEnum_UserListMembershipStatus = 1
	// Open status - List is accruing members and can be targeted to.
	UserListMembershipStatusEnum_OPEN UserListMembershipStatusEnum_UserListMembershipStatus = 2
	// Closed status - No new members being added. Cannot be used for targeting.
	UserListMembershipStatusEnum_CLOSED UserListMembershipStatusEnum_UserListMembershipStatus = 3
)

// Enum value maps for UserListMembershipStatusEnum_UserListMembershipStatus.
var (
	UserListMembershipStatusEnum_UserListMembershipStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "OPEN",
		3: "CLOSED",
	}
	UserListMembershipStatusEnum_UserListMembershipStatus_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"OPEN":        2,
		"CLOSED":      3,
	}
)

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

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

func (UserListMembershipStatusEnum_UserListMembershipStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_user_list_membership_status_proto_enumTypes[0].Descriptor()
}

func (UserListMembershipStatusEnum_UserListMembershipStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_user_list_membership_status_proto_enumTypes[0]
}

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

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

// Membership status of this user list. Indicates whether a user list is open
// or active. Only open user lists can accumulate more users and can be used for
// targeting.
type UserListMembershipStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*UserListMembershipStatusEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_user_list_membership_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDesc = []byte{
	0x0a, 0x3f, 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,
	0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72,
	0x73, 0x68, 0x69, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x6e,
	0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
	0x73, 0x68, 0x69, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x4e,
	0x0a, 0x18, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72,
	0x73, 0x68, 0x69, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e,
	0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x03, 0x42, 0xf2,
	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, 0x1d, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65,
	0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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_user_list_membership_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescData = file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_user_list_membership_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_user_list_membership_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_user_list_membership_status_proto_goTypes = []interface{}{
	(UserListMembershipStatusEnum_UserListMembershipStatus)(0), // 0: google.ads.googleads.v2.enums.UserListMembershipStatusEnum.UserListMembershipStatus
	(*UserListMembershipStatusEnum)(nil),                       // 1: google.ads.googleads.v2.enums.UserListMembershipStatusEnum
}
var file_google_ads_googleads_v2_enums_user_list_membership_status_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_user_list_membership_status_proto_init() }
func file_google_ads_googleads_v2_enums_user_list_membership_status_proto_init() {
	if File_google_ads_googleads_v2_enums_user_list_membership_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_user_list_membership_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserListMembershipStatusEnum); 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_user_list_membership_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_user_list_membership_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_user_list_membership_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_user_list_membership_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_user_list_membership_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_user_list_membership_status_proto = out.File
	file_google_ads_googleads_v2_enums_user_list_membership_status_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_user_list_membership_status_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_user_list_membership_status_proto_depIdxs = nil
}
