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

const (
	// Not specified.
	UserListDateRuleItemOperatorEnum_UNSPECIFIED UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 0
	// Used for return value only. Represents value unknown in this version.
	UserListDateRuleItemOperatorEnum_UNKNOWN UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 1
	// Equals.
	UserListDateRuleItemOperatorEnum_EQUALS UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 2
	// Not Equals.
	UserListDateRuleItemOperatorEnum_NOT_EQUALS UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 3
	// Before.
	UserListDateRuleItemOperatorEnum_BEFORE UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 4
	// After.
	UserListDateRuleItemOperatorEnum_AFTER UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator = 5
)

var UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "EQUALS",
	3: "NOT_EQUALS",
	4: "BEFORE",
	5: "AFTER",
}

var UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"EQUALS":      2,
	"NOT_EQUALS":  3,
	"BEFORE":      4,
	"AFTER":       5,
}

func (x UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator) String() string {
	return proto.EnumName(UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name, int32(x))
}

func (UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_37e7b607763ee2a2, []int{0, 0}
}

// Supported rule operator for date type.
type UserListDateRuleItemOperatorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserListDateRuleItemOperatorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator", UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_name, UserListDateRuleItemOperatorEnum_UserListDateRuleItemOperator_value)
	proto.RegisterType((*UserListDateRuleItemOperatorEnum)(nil), "google.ads.googleads.v3.enums.UserListDateRuleItemOperatorEnum")
}

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

var fileDescriptor_37e7b607763ee2a2 = []byte{
	// 344 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xd1, 0x4e, 0x83, 0x30,
	0x14, 0x15, 0xe6, 0x66, 0xec, 0x12, 0x25, 0x3c, 0x9a, 0x2d, 0x71, 0xfb, 0x80, 0xf2, 0xc0, 0x5b,
	0x7d, 0x2a, 0xae, 0x5b, 0x16, 0x17, 0x98, 0xdb, 0x98, 0x89, 0x21, 0x21, 0x55, 0x1a, 0x42, 0x02,
	0x2d, 0x69, 0xcb, 0x7e, 0xc4, 0x3f, 0xf0, 0xd1, 0x4f, 0xf1, 0x53, 0xfc, 0x00, 0x9f, 0x0d, 0xb0,
	0xed, 0x4d, 0x5e, 0x9a, 0xd3, 0x9e, 0x73, 0xcf, 0xbd, 0xe7, 0x16, 0x90, 0x54, 0x88, 0x34, 0x67,
	0x0e, 0x4d, 0x94, 0xd3, 0xc2, 0x1a, 0x1d, 0x5c, 0x87, 0xf1, 0xaa, 0x50, 0x4e, 0xa5, 0x98, 0x8c,
	0xf3, 0x4c, 0xe9, 0x38, 0xa1, 0x9a, 0xc5, 0xb2, 0xca, 0x59, 0x9c, 0x69, 0x56, 0xc4, 0xa2, 0x64,
	0x92, 0x6a, 0x21, 0x61, 0x29, 0x85, 0x16, 0xf6, 0xb8, 0xad, 0x85, 0x34, 0x51, 0xf0, 0x6c, 0x03,
	0x0f, 0x2e, 0x6c, 0x6c, 0xee, 0x46, 0xa7, 0x2e, 0x65, 0xe6, 0x50, 0xce, 0x85, 0xa6, 0x3a, 0x13,
	0x5c, 0xb5, 0xc5, 0xd3, 0x0f, 0x03, 0xdc, 0x87, 0x8a, 0xc9, 0x55, 0xa6, 0xf4, 0x8c, 0x6a, 0xb6,
	0xa9, 0x72, 0xb6, 0xd4, 0xac, 0x08, 0x8e, 0x3d, 0x08, 0xaf, 0x8a, 0xa9, 0x00, 0xa3, 0x2e, 0x8d,
	0x7d, 0x0b, 0x86, 0xa1, 0xbf, 0x5d, 0x93, 0xc7, 0xe5, 0x7c, 0x49, 0x66, 0xd6, 0x85, 0x3d, 0x04,
	0x57, 0xa1, 0xff, 0xe4, 0x07, 0x2f, 0xbe, 0x65, 0xd8, 0x00, 0x0c, 0xc8, 0x73, 0x88, 0x57, 0x5b,
	0xcb, 0xb4, 0x6f, 0x00, 0xf0, 0x83, 0x5d, 0x7c, 0xbc, 0xf7, 0x6a, 0xce, 0x23, 0xf3, 0x60, 0x43,
	0xac, 0x4b, 0xfb, 0x1a, 0xf4, 0xf1, 0x7c, 0x47, 0x36, 0x56, 0xdf, 0xfb, 0x35, 0xc0, 0xe4, 0x5d,
	0x14, 0xb0, 0x33, 0x99, 0x37, 0xe9, 0x1a, 0x6a, 0x5d, 0xc7, 0x5b, 0x1b, 0xaf, 0xde, 0xd1, 0x23,
	0x15, 0x39, 0xe5, 0x29, 0x14, 0x32, 0x75, 0x52, 0xc6, 0x9b, 0xf0, 0xa7, 0xa5, 0x97, 0x99, 0xfa,
	0xe7, 0x0f, 0x1e, 0x9a, 0xf3, 0xd3, 0xec, 0x2d, 0x30, 0xfe, 0x32, 0xc7, 0x8b, 0xd6, 0x0a, 0x27,
	0x0a, 0xb6, 0xb0, 0x46, 0x7b, 0x17, 0xd6, 0x4b, 0x52, 0xdf, 0x27, 0x3e, 0xc2, 0x89, 0x8a, 0xce,
	0x7c, 0xb4, 0x77, 0xa3, 0x86, 0xff, 0x31, 0x27, 0xed, 0x23, 0x42, 0x38, 0x51, 0x08, 0x9d, 0x15,
	0x08, 0xed, 0x5d, 0x84, 0x1a, 0xcd, 0xdb, 0xa0, 0x19, 0xcc, 0xfd, 0x0b, 0x00, 0x00, 0xff, 0xff,
	0xee, 0x52, 0xc4, 0xc4, 0x1b, 0x02, 0x00, 0x00,
}
