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

// Enum containing possible custom interest types.
type CustomInterestTypeEnum_CustomInterestType int32

const (
	// Not specified.
	CustomInterestTypeEnum_UNSPECIFIED CustomInterestTypeEnum_CustomInterestType = 0
	// Used for return value only. Represents value unknown in this version.
	CustomInterestTypeEnum_UNKNOWN CustomInterestTypeEnum_CustomInterestType = 1
	// Allows brand advertisers to define custom affinity audience lists.
	CustomInterestTypeEnum_CUSTOM_AFFINITY CustomInterestTypeEnum_CustomInterestType = 2
	// Allows advertisers to define custom intent audience lists.
	CustomInterestTypeEnum_CUSTOM_INTENT CustomInterestTypeEnum_CustomInterestType = 3
)

var CustomInterestTypeEnum_CustomInterestType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CUSTOM_AFFINITY",
	3: "CUSTOM_INTENT",
}

var CustomInterestTypeEnum_CustomInterestType_value = map[string]int32{
	"UNSPECIFIED":     0,
	"UNKNOWN":         1,
	"CUSTOM_AFFINITY": 2,
	"CUSTOM_INTENT":   3,
}

func (x CustomInterestTypeEnum_CustomInterestType) String() string {
	return proto.EnumName(CustomInterestTypeEnum_CustomInterestType_name, int32(x))
}

func (CustomInterestTypeEnum_CustomInterestType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_76f3dccaa5d605c7, []int{0, 0}
}

// The types of custom interest.
type CustomInterestTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CustomInterestTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomInterestTypeEnum_CustomInterestType", CustomInterestTypeEnum_CustomInterestType_name, CustomInterestTypeEnum_CustomInterestType_value)
	proto.RegisterType((*CustomInterestTypeEnum)(nil), "google.ads.googleads.v3.enums.CustomInterestTypeEnum")
}

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

var fileDescriptor_76f3dccaa5d605c7 = []byte{
	// 316 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x6a, 0xc2, 0x30,
	0x1c, 0x9e, 0x15, 0x36, 0x88, 0x0c, 0xbb, 0x0e, 0x36, 0x18, 0xf3, 0xa0, 0x0f, 0x90, 0x1e, 0x72,
	0x19, 0xd9, 0x29, 0xba, 0x2a, 0x61, 0x2c, 0x0a, 0x56, 0xc7, 0xa4, 0x20, 0x9d, 0x0d, 0xa1, 0x60,
	0x93, 0x62, 0xa2, 0xe0, 0xeb, 0xec, 0xb8, 0x47, 0xd9, 0xa3, 0x8c, 0x3d, 0xc4, 0x68, 0xa2, 0xbd,
	0xc8, 0x76, 0x29, 0x1f, 0xbf, 0xef, 0x4f, 0xbf, 0x7c, 0xe0, 0x41, 0x28, 0x25, 0xd6, 0x3c, 0x4c,
	0x33, 0x1d, 0x3a, 0x58, 0xa1, 0x1d, 0x0a, 0xb9, 0xdc, 0x16, 0x3a, 0x5c, 0x6d, 0xb5, 0x51, 0xc5,
	0x32, 0x97, 0x86, 0x6f, 0xb8, 0x36, 0x4b, 0xb3, 0x2f, 0x39, 0x2c, 0x37, 0xca, 0xa8, 0xa0, 0xe3,
	0xe4, 0x30, 0xcd, 0x34, 0xac, 0x9d, 0x70, 0x87, 0xa0, 0x75, 0xde, 0xdd, 0x1f, 0x83, 0xcb, 0x3c,
	0x4c, 0xa5, 0x54, 0x26, 0x35, 0xb9, 0x92, 0xda, 0x99, 0x7b, 0x06, 0xdc, 0x0c, 0x6c, 0x34, 0x3d,
	0x24, 0xc7, 0xfb, 0x92, 0x47, 0x72, 0x5b, 0xf4, 0x16, 0x20, 0x38, 0x65, 0x82, 0x36, 0x68, 0xcd,
	0xd8, 0x74, 0x12, 0x0d, 0xe8, 0x90, 0x46, 0x4f, 0xfe, 0x59, 0xd0, 0x02, 0x17, 0x33, 0xf6, 0xcc,
	0xc6, 0xaf, 0xcc, 0x6f, 0x04, 0xd7, 0xa0, 0x3d, 0x98, 0x4d, 0xe3, 0xf1, 0xcb, 0x92, 0x0c, 0x87,
	0x94, 0xd1, 0xf8, 0xcd, 0xf7, 0x82, 0x2b, 0x70, 0x79, 0x38, 0x52, 0x16, 0x47, 0x2c, 0xf6, 0x9b,
	0xfd, 0x9f, 0x06, 0xe8, 0xae, 0x54, 0x01, 0xff, 0x6d, 0xde, 0xbf, 0x3d, 0xfd, 0xff, 0xa4, 0x2a,
	0x3d, 0x69, 0x2c, 0xfa, 0x07, 0xa7, 0x50, 0xeb, 0x54, 0x0a, 0xa8, 0x36, 0x22, 0x14, 0x5c, 0xda,
	0x27, 0x1d, 0xd7, 0x2b, 0x73, 0xfd, 0xc7, 0x98, 0x8f, 0xf6, 0xfb, 0xe1, 0x35, 0x47, 0x84, 0x7c,
	0x7a, 0x9d, 0x91, 0x8b, 0x22, 0x99, 0x86, 0x0e, 0x56, 0x68, 0x8e, 0x60, 0xb5, 0x82, 0xfe, 0x3a,
	0xf2, 0x09, 0xc9, 0x74, 0x52, 0xf3, 0xc9, 0x1c, 0x25, 0x96, 0xff, 0xf6, 0xba, 0xee, 0x88, 0x31,
	0xc9, 0x34, 0xc6, 0xb5, 0x02, 0xe3, 0x39, 0xc2, 0xd8, 0x6a, 0xde, 0xcf, 0x6d, 0x31, 0xf4, 0x1b,
	0x00, 0x00, 0xff, 0xff, 0x04, 0x2b, 0x31, 0x32, 0xe4, 0x01, 0x00, 0x00,
}
