// 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/matching_function_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

// Possible operators in a matching function.
type MatchingFunctionOperatorEnum_MatchingFunctionOperator int32

const (
	// Not specified.
	MatchingFunctionOperatorEnum_UNSPECIFIED MatchingFunctionOperatorEnum_MatchingFunctionOperator = 0
	// Used for return value only. Represents value unknown in this version.
	MatchingFunctionOperatorEnum_UNKNOWN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 1
	// The IN operator.
	MatchingFunctionOperatorEnum_IN MatchingFunctionOperatorEnum_MatchingFunctionOperator = 2
	// The IDENTITY operator.
	MatchingFunctionOperatorEnum_IDENTITY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 3
	// The EQUALS operator
	MatchingFunctionOperatorEnum_EQUALS MatchingFunctionOperatorEnum_MatchingFunctionOperator = 4
	// Operator that takes two or more operands that are of type
	// FunctionOperand and checks that all the operands evaluate to true.
	// For functions related to ad formats, all the operands must be in
	// left_operands.
	MatchingFunctionOperatorEnum_AND MatchingFunctionOperatorEnum_MatchingFunctionOperator = 5
	// Operator that returns true if the elements in left_operands contain any
	// of the elements in right_operands. Otherwise, return false. The
	// right_operands must contain at least 1 and no more than 3
	// ConstantOperands.
	MatchingFunctionOperatorEnum_CONTAINS_ANY MatchingFunctionOperatorEnum_MatchingFunctionOperator = 6
)

// Enum value maps for MatchingFunctionOperatorEnum_MatchingFunctionOperator.
var (
	MatchingFunctionOperatorEnum_MatchingFunctionOperator_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "IN",
		3: "IDENTITY",
		4: "EQUALS",
		5: "AND",
		6: "CONTAINS_ANY",
	}
	MatchingFunctionOperatorEnum_MatchingFunctionOperator_value = map[string]int32{
		"UNSPECIFIED":  0,
		"UNKNOWN":      1,
		"IN":           2,
		"IDENTITY":     3,
		"EQUALS":       4,
		"AND":          5,
		"CONTAINS_ANY": 6,
	}
)

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

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

func (MatchingFunctionOperatorEnum_MatchingFunctionOperator) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_matching_function_operator_proto_enumTypes[0].Descriptor()
}

func (MatchingFunctionOperatorEnum_MatchingFunctionOperator) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_matching_function_operator_proto_enumTypes[0]
}

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

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

// Container for enum describing matching function operator.
type MatchingFunctionOperatorEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*MatchingFunctionOperatorEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v3_enums_matching_function_operator_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDesc = []byte{
	0x0a, 0x3e, 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,
	0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
	0x6e, 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, 0x95, 0x01,
	0x0a, 0x1c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x75,
	0x0a, 0x18, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 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, 0x06, 0x0a, 0x02, 0x49, 0x4e, 0x10, 0x02,
	0x12, 0x0c, 0x0a, 0x08, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x10, 0x03, 0x12, 0x0a,
	0x0a, 0x06, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x53, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e,
	0x44, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x53, 0x5f,
	0x41, 0x4e, 0x59, 0x10, 0x06, 0x42, 0xf2, 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, 0x1d, 0x4d, 0x61, 0x74,
	0x63, 0x68, 0x69, 0x6e, 0x67, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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_matching_function_operator_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescData = file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_matching_function_operator_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_matching_function_operator_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_matching_function_operator_proto_goTypes = []interface{}{
	(MatchingFunctionOperatorEnum_MatchingFunctionOperator)(0), // 0: google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum.MatchingFunctionOperator
	(*MatchingFunctionOperatorEnum)(nil),                       // 1: google.ads.googleads.v3.enums.MatchingFunctionOperatorEnum
}
var file_google_ads_googleads_v3_enums_matching_function_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_matching_function_operator_proto_init() }
func file_google_ads_googleads_v3_enums_matching_function_operator_proto_init() {
	if File_google_ads_googleads_v3_enums_matching_function_operator_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_matching_function_operator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MatchingFunctionOperatorEnum); 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_matching_function_operator_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_matching_function_operator_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_matching_function_operator_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_matching_function_operator_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_matching_function_operator_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_matching_function_operator_proto = out.File
	file_google_ads_googleads_v3_enums_matching_function_operator_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_matching_function_operator_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_matching_function_operator_proto_depIdxs = nil
}
