// 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/v1/enums/user_list_combined_rule_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 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
)

// Enum value maps for UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator.
var (
	UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "AND",
		3: "AND_NOT",
	}
	UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"AND":         2,
		"AND_NOT":     3,
	}
)

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

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

func (UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_enumTypes[0].Descriptor()
}

func (UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_enumTypes[0]
}

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

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

// Logical operator connecting two rules.
type UserListCombinedRuleOperatorEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*UserListCombinedRuleOperatorEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDesc = []byte{
	0x0a, 0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
	0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 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, 0x31, 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, 0x76, 0x0a, 0x20, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x43,
	0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61,
	0x74, 0x6f, 0x72, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x52, 0x0a, 0x1c, 0x55, 0x73, 0x65, 0x72, 0x4c,
	0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x0b,
	0x0a, 0x07, 0x41, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x10, 0x03, 0x42, 0xf6, 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, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d,
	0x73, 0x42, 0x21, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69,
	0x6e, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x31, 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, 0x31, 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, 0x31, 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, 0x31, 0x3a, 0x3a, 0x45,
	0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescData = file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_goTypes = []interface{}{
	(UserListCombinedRuleOperatorEnum_UserListCombinedRuleOperator)(0), // 0: google.ads.googleads.v1.enums.UserListCombinedRuleOperatorEnum.UserListCombinedRuleOperator
	(*UserListCombinedRuleOperatorEnum)(nil),                           // 1: google.ads.googleads.v1.enums.UserListCombinedRuleOperatorEnum
}
var file_google_ads_googleads_v1_enums_user_list_combined_rule_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_v1_enums_user_list_combined_rule_operator_proto_init() }
func file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_init() {
	if File_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UserListCombinedRuleOperatorEnum); 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_v1_enums_user_list_combined_rule_operator_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto = out.File
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_user_list_combined_rule_operator_proto_depIdxs = nil
}
