// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/user_list_rule_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

// Enum describing possible user list rule types.
type UserListRuleTypeEnum_UserListRuleType int32

const (
	// Not specified.
	UserListRuleTypeEnum_UNSPECIFIED UserListRuleTypeEnum_UserListRuleType = 0
	// Used for return value only. Represents value unknown in this version.
	UserListRuleTypeEnum_UNKNOWN UserListRuleTypeEnum_UserListRuleType = 1
	// Conjunctive normal form.
	UserListRuleTypeEnum_AND_OF_ORS UserListRuleTypeEnum_UserListRuleType = 2
	// Disjunctive normal form.
	UserListRuleTypeEnum_OR_OF_ANDS UserListRuleTypeEnum_UserListRuleType = 3
)

var UserListRuleTypeEnum_UserListRuleType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "AND_OF_ORS",
	3: "OR_OF_ANDS",
}

var UserListRuleTypeEnum_UserListRuleType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"AND_OF_ORS":  2,
	"OR_OF_ANDS":  3,
}

func (x UserListRuleTypeEnum_UserListRuleType) String() string {
	return proto.EnumName(UserListRuleTypeEnum_UserListRuleType_name, int32(x))
}

func (UserListRuleTypeEnum_UserListRuleType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_445e52642a4c2209, []int{0, 0}
}

// Rule based user list rule type.
type UserListRuleTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserListRuleTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListRuleTypeEnum_UserListRuleType", UserListRuleTypeEnum_UserListRuleType_name, UserListRuleTypeEnum_UserListRuleType_value)
	proto.RegisterType((*UserListRuleTypeEnum)(nil), "google.ads.googleads.v3.enums.UserListRuleTypeEnum")
}

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

var fileDescriptor_445e52642a4c2209 = []byte{
	// 316 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x6a, 0xf3, 0x30,
	0x10, 0xfd, 0xe2, 0xc0, 0x57, 0x50, 0xa0, 0x35, 0xa6, 0xdd, 0x94, 0x66, 0x91, 0x1c, 0x40, 0x5e,
	0x78, 0x51, 0x50, 0x57, 0x4a, 0xf3, 0x43, 0x68, 0x91, 0x4d, 0xd2, 0xa4, 0x50, 0x0c, 0xc6, 0xad,
	0x85, 0x6a, 0x70, 0x24, 0xe3, 0x91, 0x03, 0xb9, 0x4e, 0x97, 0x3d, 0x4a, 0x8f, 0x92, 0x53, 0x14,
	0x49, 0x4d, 0x16, 0x81, 0x76, 0x23, 0xde, 0xcc, 0x7b, 0x6f, 0xf4, 0x66, 0xd0, 0xad, 0x50, 0x4a,
	0x54, 0x3c, 0xcc, 0x0b, 0x08, 0x1d, 0x34, 0x68, 0x1b, 0x85, 0x5c, 0xb6, 0x1b, 0x08, 0x5b, 0xe0,
	0x4d, 0x56, 0x95, 0xa0, 0xb3, 0xa6, 0xad, 0x78, 0xa6, 0x77, 0x35, 0xc7, 0x75, 0xa3, 0xb4, 0x0a,
	0xfa, 0x4e, 0x8d, 0xf3, 0x02, 0xf0, 0xd1, 0x88, 0xb7, 0x11, 0xb6, 0xc6, 0xeb, 0x9b, 0xc3, 0xdc,
	0xba, 0x0c, 0x73, 0x29, 0x95, 0xce, 0x75, 0xa9, 0x24, 0x38, 0xf3, 0xf0, 0x1d, 0x5d, 0xae, 0x80,
	0x37, 0x8f, 0x25, 0xe8, 0x45, 0x5b, 0xf1, 0xa7, 0x5d, 0xcd, 0x27, 0xb2, 0xdd, 0x0c, 0x13, 0xe4,
	0x9f, 0xf6, 0x83, 0x0b, 0xd4, 0x5b, 0xb1, 0x65, 0x32, 0xb9, 0x9f, 0x4f, 0xe7, 0x93, 0xb1, 0xff,
	0x2f, 0xe8, 0xa1, 0xb3, 0x15, 0x7b, 0x60, 0xf1, 0x33, 0xf3, 0x3b, 0xc1, 0x39, 0x42, 0x94, 0x8d,
	0xb3, 0x78, 0x9a, 0xc5, 0x8b, 0xa5, 0xef, 0x99, 0x3a, 0x5e, 0x98, 0x92, 0xb2, 0xf1, 0xd2, 0xef,
	0x8e, 0xf6, 0x1d, 0x34, 0x78, 0x53, 0x1b, 0xfc, 0x67, 0xda, 0xd1, 0xd5, 0xe9, 0xaf, 0x89, 0x89,
	0x99, 0x74, 0x5e, 0x46, 0x3f, 0x3e, 0xa1, 0xaa, 0x5c, 0x0a, 0xac, 0x1a, 0x11, 0x0a, 0x2e, 0xed,
	0x12, 0x87, 0x73, 0xd5, 0x25, 0xfc, 0x72, 0xbd, 0x3b, 0xfb, 0x7e, 0x78, 0xdd, 0x19, 0xa5, 0x9f,
	0x5e, 0x7f, 0xe6, 0x46, 0xd1, 0x02, 0xb0, 0x83, 0x06, 0xad, 0x23, 0x6c, 0x36, 0x87, 0xaf, 0x03,
	0x9f, 0xd2, 0x02, 0xd2, 0x23, 0x9f, 0xae, 0xa3, 0xd4, 0xf2, 0x7b, 0x6f, 0xe0, 0x9a, 0x84, 0xd0,
	0x02, 0x08, 0x39, 0x2a, 0x08, 0x59, 0x47, 0x84, 0x58, 0xcd, 0xeb, 0x7f, 0x1b, 0x2c, 0xfa, 0x0e,
	0x00, 0x00, 0xff, 0xff, 0xf4, 0xca, 0x25, 0x39, 0xd5, 0x01, 0x00, 0x00,
}
