// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/user_list_combined_rule_operator.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 combined rule operators.
type UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator int32

const (
	// Not specified.
	UserListCombinedRuleOperatorEnum_UNSPECIFIED UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 0
	// Used for return value only. Represents value unknown in this version.
	UserListCombinedRuleOperatorEnum_UNKNOWN UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 1
	// A AND B.
	UserListCombinedRuleOperatorEnum_AND UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 2
	// A AND NOT B.
	UserListCombinedRuleOperatorEnum_AND_NOT UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator = 3
)

var UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "AND",
	3: "AND_NOT",
}

var UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"AND":         2,
	"AND_NOT":     3,
}

func (x UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) String() string {
	return proto.EnumName(UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name, int32(x))
}

func (UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a88176faa8d2b974, []int{0, 0}
}

// Logical operator connecting two rules.
type UserListCombinedRuleOperatorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserListCombinedRuleOperatorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator", UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name, UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_value)
	proto.RegisterType((*UserListCombinedRuleOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListCombinedRuleOperatorEnum")
}

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

var fileDescriptor_a88176faa8d2b974 = []byte{
	// 317 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x6a, 0xc2, 0x40,
	0x14, 0xac, 0x11, 0x2a, 0xac, 0x87, 0x86, 0x1c, 0x8b, 0x42, 0xf5, 0x03, 0x36, 0x87, 0xdc, 0xb6,
	0xa7, 0xd5, 0x58, 0x91, 0x96, 0x55, 0x6c, 0xb5, 0x50, 0x02, 0x21, 0x9a, 0x25, 0x04, 0x92, 0x7d,
	0x61, 0x5f, 0xe2, 0x07, 0xf5, 0xd8, 0x4f, 0xe9, 0xa7, 0xf4, 0x03, 0x7a, 0x2e, 0xd9, 0x55, 0x6f,
	0xcd, 0x65, 0x19, 0x76, 0xe6, 0xcd, 0xbc, 0x37, 0x24, 0xcc, 0x00, 0xb2, 0x42, 0xfa, 0x49, 0x8a,
	0xbe, 0x85, 0x2d, 0x3a, 0x05, 0xbe, 0x54, 0x4d, 0x89, 0x7e, 0x83, 0x52, 0xc7, 0x45, 0x8e, 0x75,
	0x7c, 0x84, 0xf2, 0x90, 0x2b, 0x99, 0xc6, 0xba, 0x29, 0x64, 0x0c, 0x95, 0xd4, 0x49, 0x0d, 0x9a,
	0x56, 0x1a, 0x6a, 0xf0, 0xc6, 0x76, 0x94, 0x26, 0x29, 0xd2, 0xab, 0x0b, 0x3d, 0x05, 0xd4, 0xb8,
	0xdc, 0x8f, 0x2e, 0x21, 0x55, 0xee, 0x27, 0x4a, 0x41, 0x9d, 0xd4, 0x39, 0x28, 0xb4, 0xc3, 0xd3,
	0x13, 0x79, 0xd8, 0xa1, 0xd4, 0x2f, 0x39, 0xd6, 0xf3, 0x73, 0xc8, 0xb6, 0x29, 0xe4, 0xfa, 0x1c,
	0xb1, 0x50, 0x4d, 0x39, 0xdd, 0x92, 0x51, 0x97, 0xc6, 0xbb, 0x23, 0xc3, 0x9d, 0x78, 0xdd, 0x2c,
	0xe6, 0xab, 0xa7, 0xd5, 0x22, 0x74, 0x6f, 0xbc, 0x21, 0x19, 0xec, 0xc4, 0xb3, 0x58, 0xbf, 0x0b,
	0xb7, 0xe7, 0x0d, 0x48, 0x9f, 0x8b, 0xd0, 0x75, 0xda, 0x5f, 0x2e, 0xc2, 0x58, 0xac, 0xdf, 0xdc,
	0xfe, 0xec, 0xb7, 0x47, 0x26, 0x47, 0x28, 0x69, 0xe7, 0xee, 0xb3, 0x49, 0x57, 0xee, 0xa6, 0x3d,
	0x60, 0xd3, 0xfb, 0x98, 0x9d, 0x3d, 0x32, 0x28, 0x12, 0x95, 0x51, 0xd0, 0x99, 0x9f, 0x49, 0x65,
	0xce, 0xbb, 0xb4, 0x5a, 0xe5, 0xf8, 0x4f, 0xc9, 0x8f, 0xe6, 0xfd, 0x74, 0xfa, 0x4b, 0xce, 0xbf,
	0x9c, 0xf1, 0xd2, 0x5a, 0xf1, 0x14, 0xa9, 0x85, 0x2d, 0xda, 0x07, 0xb4, 0xed, 0x01, 0xbf, 0x2f,
	0x7c, 0xc4, 0x53, 0x8c, 0xae, 0x7c, 0xb4, 0x0f, 0x22, 0xc3, 0xff, 0x38, 0x13, 0xfb, 0xc9, 0x18,
	0x4f, 0x91, 0xb1, 0xab, 0x82, 0xb1, 0x7d, 0xc0, 0x98, 0xd1, 0x1c, 0x6e, 0xcd, 0x62, 0xc1, 0x5f,
	0x00, 0x00, 0x00, 0xff, 0xff, 0x54, 0x69, 0x22, 0x93, 0xfc, 0x01, 0x00, 0x00,
}
