// 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_number_rule_item_operator.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 describing possible user list number rule item operators.
type UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator int32

const (
	// Not specified.
	UserListNumberRuleItemOperatorEnum_UNSPECIFIED UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 0
	// Used for return value only. Represents value unknown in this version.
	UserListNumberRuleItemOperatorEnum_UNKNOWN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 1
	// Greater than.
	UserListNumberRuleItemOperatorEnum_GREATER_THAN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 2
	// Greater than or equal.
	UserListNumberRuleItemOperatorEnum_GREATER_THAN_OR_EQUAL UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 3
	// Equals.
	UserListNumberRuleItemOperatorEnum_EQUALS UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 4
	// Not equals.
	UserListNumberRuleItemOperatorEnum_NOT_EQUALS UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 5
	// Less than.
	UserListNumberRuleItemOperatorEnum_LESS_THAN UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 6
	// Less than or equal.
	UserListNumberRuleItemOperatorEnum_LESS_THAN_OR_EQUAL UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator = 7
)

// Enum value maps for UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator.
var (
	UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "GREATER_THAN",
		3: "GREATER_THAN_OR_EQUAL",
		4: "EQUALS",
		5: "NOT_EQUALS",
		6: "LESS_THAN",
		7: "LESS_THAN_OR_EQUAL",
	}
	UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator_value = map[string]int32{
		"UNSPECIFIED":           0,
		"UNKNOWN":               1,
		"GREATER_THAN":          2,
		"GREATER_THAN_OR_EQUAL": 3,
		"EQUALS":                4,
		"NOT_EQUALS":            5,
		"LESS_THAN":             6,
		"LESS_THAN_OR_EQUAL":    7,
	}
)

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

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

func (UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_enumTypes[0].Descriptor()
}

func (UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_enumTypes[0]
}

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

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

// Supported rule operator for number type.
type UserListNumberRuleItemOperatorEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*UserListNumberRuleItemOperatorEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDesc = []byte{
	0x0a, 0x47, 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, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
	0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61,
	0x74, 0x6f, 0x72, 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, 0xd5, 0x01, 0x0a, 0x22, 0x55, 0x73, 0x65, 0x72, 0x4c,
	0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x49, 0x74, 0x65,
	0x6d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0xae, 0x01,
	0x0a, 0x1e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
	0x52, 0x75, 0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72,
	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, 0x10,
	0x0a, 0x0c, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x10, 0x02,
	0x12, 0x19, 0x0a, 0x15, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e,
	0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x45,
	0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x54, 0x5f, 0x45,
	0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x45, 0x53, 0x53, 0x5f,
	0x54, 0x48, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54,
	0x48, 0x41, 0x4e, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x10, 0x07, 0x42, 0xf8,
	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, 0x23, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x75,
	0x6d, 0x62, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x4f, 0x70, 0x65, 0x72,
	0x61, 0x74, 0x6f, 0x72, 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_number_rule_item_operator_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescData = file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_goTypes = []interface{}{
	(UserListNumberRuleItemOperatorEnum_UserListNumberRuleItemOperator)(0), // 0: google.ads.googleads.v3.enums.UserListNumberRuleItemOperatorEnum.UserListNumberRuleItemOperator
	(*UserListNumberRuleItemOperatorEnum)(nil),                             // 1: google.ads.googleads.v3.enums.UserListNumberRuleItemOperatorEnum
}
var file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_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_number_rule_item_operator_proto_init() }
func file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_init() {
	if File_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserListNumberRuleItemOperatorEnum); 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_number_rule_item_operator_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto = out.File
	file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_user_list_number_rule_item_operator_proto_depIdxs = nil
}
