// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/matching_function_context_type.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

// Possible context types for an operand in a matching function.
type MatchingFunctionContextTypeEnum_MatchingFunctionContextType int32

const (
	// Not specified.
	MatchingFunctionContextTypeEnum_UNSPECIFIED MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 0
	// Used for return value only. Represents value unknown in this version.
	MatchingFunctionContextTypeEnum_UNKNOWN MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 1
	// Feed item id in the request context.
	MatchingFunctionContextTypeEnum_FEED_ITEM_ID MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 2
	// The device being used (possible values are 'Desktop' or 'Mobile').
	MatchingFunctionContextTypeEnum_DEVICE_NAME MatchingFunctionContextTypeEnum_MatchingFunctionContextType = 3
)

var MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "FEED_ITEM_ID",
	3: "DEVICE_NAME",
}

var MatchingFunctionContextTypeEnum_MatchingFunctionContextType_value = map[string]int32{
	"UNSPECIFIED":  0,
	"UNKNOWN":      1,
	"FEED_ITEM_ID": 2,
	"DEVICE_NAME":  3,
}

func (x MatchingFunctionContextTypeEnum_MatchingFunctionContextType) String() string {
	return proto.EnumName(MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name, int32(x))
}

func (MatchingFunctionContextTypeEnum_MatchingFunctionContextType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_59c241b42801f559, []int{0, 0}
}

// Container for context types for an operand in a matching function.
type MatchingFunctionContextTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MatchingFunctionContextTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.MatchingFunctionContextTypeEnum_MatchingFunctionContextType", MatchingFunctionContextTypeEnum_MatchingFunctionContextType_name, MatchingFunctionContextTypeEnum_MatchingFunctionContextType_value)
	proto.RegisterType((*MatchingFunctionContextTypeEnum)(nil), "google.ads.googleads.v3.enums.MatchingFunctionContextTypeEnum")
}

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

var fileDescriptor_59c241b42801f559 = []byte{
	// 328 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xfb, 0x30,
	0x1c, 0xfd, 0xb7, 0x83, 0xbf, 0x90, 0x09, 0x96, 0x1e, 0xd5, 0xa1, 0xdb, 0x07, 0x48, 0x0f, 0xbd,
	0xc5, 0x53, 0xb7, 0x66, 0xa3, 0xc8, 0xea, 0xc0, 0xad, 0x82, 0x14, 0x4b, 0x6c, 0x63, 0x2c, 0xac,
	0x49, 0x59, 0xb2, 0xe1, 0x8e, 0x7e, 0x15, 0x8f, 0x7e, 0x14, 0x3f, 0x8a, 0x77, 0xef, 0x92, 0x64,
	0xdb, 0xcd, 0x5d, 0xc2, 0x23, 0xbf, 0xf7, 0x7b, 0xef, 0xf7, 0x1e, 0x18, 0x32, 0x21, 0xd8, 0x92,
	0x06, 0xa4, 0x92, 0x81, 0x85, 0x1a, 0x6d, 0xc2, 0x80, 0xf2, 0x75, 0x23, 0x83, 0x86, 0xa8, 0xf2,
	0xb5, 0xe6, 0xac, 0x78, 0x59, 0xf3, 0x52, 0xd5, 0x82, 0x17, 0xa5, 0xe0, 0x8a, 0xbe, 0xa9, 0x42,
	0x6d, 0x5b, 0x0a, 0xdb, 0x95, 0x50, 0xc2, 0xef, 0xd9, 0x45, 0x48, 0x2a, 0x09, 0x0f, 0x1a, 0x70,
	0x13, 0x42, 0xa3, 0x71, 0x7e, 0xb9, 0xb7, 0x68, 0xeb, 0x80, 0x70, 0x2e, 0x14, 0xd1, 0x42, 0xd2,
	0x2e, 0x0f, 0xde, 0x1d, 0x70, 0x35, 0xdd, 0xb9, 0x8c, 0x77, 0x26, 0x23, 0xeb, 0x31, 0xdf, 0xb6,
	0x14, 0xf3, 0x75, 0x33, 0x78, 0x02, 0x17, 0x47, 0x28, 0xfe, 0x19, 0xe8, 0x2e, 0xd2, 0xfb, 0x19,
	0x1e, 0x25, 0xe3, 0x04, 0xc7, 0xde, 0x3f, 0xbf, 0x0b, 0x4e, 0x16, 0xe9, 0x6d, 0x7a, 0xf7, 0x90,
	0x7a, 0x8e, 0xef, 0x81, 0xd3, 0x31, 0xc6, 0x71, 0x91, 0xcc, 0xf1, 0xb4, 0x48, 0x62, 0xcf, 0xd5,
	0xfc, 0x18, 0x67, 0xc9, 0x08, 0x17, 0x69, 0x34, 0xc5, 0x5e, 0x67, 0xf8, 0xe3, 0x80, 0x7e, 0x29,
	0x1a, 0x78, 0x34, 0xc7, 0xf0, 0xfa, 0xc8, 0x0d, 0x33, 0x9d, 0x65, 0xe6, 0x3c, 0xee, 0xea, 0x84,
	0x4c, 0x2c, 0x09, 0x67, 0x50, 0xac, 0x58, 0xc0, 0x28, 0x37, 0x49, 0xf7, 0xf5, 0xb6, 0xb5, 0xfc,
	0xa3, 0xed, 0x1b, 0xf3, 0x7e, 0xb8, 0x9d, 0x49, 0x14, 0x7d, 0xba, 0xbd, 0x89, 0x95, 0x8a, 0x2a,
	0x09, 0x2d, 0xd4, 0x28, 0x0b, 0xa1, 0xae, 0x44, 0x7e, 0xed, 0xe7, 0x79, 0x54, 0xc9, 0xfc, 0x30,
	0xcf, 0xb3, 0x30, 0x37, 0xf3, 0x6f, 0xb7, 0x6f, 0x3f, 0x11, 0x8a, 0x2a, 0x89, 0xd0, 0x81, 0x81,
	0x50, 0x16, 0x22, 0x64, 0x38, 0xcf, 0xff, 0xcd, 0x61, 0xe1, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff,
	0x84, 0x8c, 0xc4, 0x0d, 0x05, 0x02, 0x00, 0x00,
}
