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

const (
	// Not specified.
	CustomInterestStatusEnum_UNSPECIFIED CustomInterestStatusEnum_CustomInterestStatus = 0
	// Used for return value only. Represents value unknown in this version.
	CustomInterestStatusEnum_UNKNOWN CustomInterestStatusEnum_CustomInterestStatus = 1
	// Enabled status - custom interest is enabled and can be targeted to.
	CustomInterestStatusEnum_ENABLED CustomInterestStatusEnum_CustomInterestStatus = 2
	// Removed status - custom interest is removed and cannot be used for
	// targeting.
	CustomInterestStatusEnum_REMOVED CustomInterestStatusEnum_CustomInterestStatus = 3
)

var CustomInterestStatusEnum_CustomInterestStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ENABLED",
	3: "REMOVED",
}

var CustomInterestStatusEnum_CustomInterestStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ENABLED":     2,
	"REMOVED":     3,
}

func (x CustomInterestStatusEnum_CustomInterestStatus) String() string {
	return proto.EnumName(CustomInterestStatusEnum_CustomInterestStatus_name, int32(x))
}

func (CustomInterestStatusEnum_CustomInterestStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c4d0aee2218e339a, []int{0, 0}
}

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

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

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

var xxx_messageInfo_CustomInterestStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomInterestStatusEnum_CustomInterestStatus", CustomInterestStatusEnum_CustomInterestStatus_name, CustomInterestStatusEnum_CustomInterestStatus_value)
	proto.RegisterType((*CustomInterestStatusEnum)(nil), "google.ads.googleads.v3.enums.CustomInterestStatusEnum")
}

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

var fileDescriptor_c4d0aee2218e339a = []byte{
	// 306 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x2a, 0x31,
	0x14, 0x7d, 0x0c, 0xc9, 0x33, 0x29, 0x0b, 0x27, 0xc4, 0x85, 0x1a, 0x59, 0xc0, 0x07, 0xb4, 0x8b,
	0xee, 0xea, 0xaa, 0x03, 0x95, 0x10, 0xb5, 0x10, 0x09, 0x63, 0x62, 0x26, 0x21, 0x95, 0x99, 0x34,
	0x63, 0x98, 0x96, 0x70, 0x3b, 0x7c, 0x90, 0x4b, 0x3f, 0xc5, 0x4f, 0x71, 0xe1, 0x37, 0x98, 0x76,
	0x80, 0x15, 0xba, 0x69, 0xce, 0xed, 0xb9, 0xe7, 0xdc, 0x73, 0x2f, 0x62, 0xda, 0x5a, 0xbd, 0x2e,
	0x88, 0xca, 0x81, 0x34, 0xd0, 0xa3, 0x1d, 0x25, 0x85, 0xa9, 0x2b, 0x20, 0xab, 0x1a, 0x9c, 0xad,
	0x96, 0xa5, 0x71, 0xc5, 0xb6, 0x00, 0xb7, 0x04, 0xa7, 0x5c, 0x0d, 0x78, 0xb3, 0xb5, 0xce, 0x76,
	0x7b, 0x8d, 0x00, 0xab, 0x1c, 0xf0, 0x51, 0x8b, 0x77, 0x14, 0x07, 0xed, 0xf5, 0xcd, 0xc1, 0x7a,
	0x53, 0x12, 0x65, 0x8c, 0x75, 0xca, 0x95, 0xd6, 0xec, 0xc5, 0x83, 0x37, 0x74, 0x39, 0x0c, 0xe6,
	0x93, 0xbd, 0xf7, 0x3c, 0x58, 0x0b, 0x53, 0x57, 0x03, 0x89, 0x2e, 0x4e, 0x71, 0xdd, 0x73, 0xd4,
	0x59, 0xc8, 0xf9, 0x4c, 0x0c, 0x27, 0x77, 0x13, 0x31, 0x8a, 0xff, 0x75, 0x3b, 0xe8, 0x6c, 0x21,
	0xef, 0xe5, 0xf4, 0x59, 0xc6, 0x2d, 0x5f, 0x08, 0xc9, 0x93, 0x07, 0x31, 0x8a, 0x23, 0x5f, 0x3c,
	0x89, 0xc7, 0x69, 0x2a, 0x46, 0x71, 0x3b, 0xf9, 0x6e, 0xa1, 0xfe, 0xca, 0x56, 0xf8, 0xcf, 0xbc,
	0xc9, 0xd5, 0xa9, 0x99, 0x33, 0x1f, 0x76, 0xd6, 0x7a, 0x49, 0xf6, 0x5a, 0x6d, 0xd7, 0xca, 0x68,
	0x6c, 0xb7, 0x9a, 0xe8, 0xc2, 0x84, 0x55, 0x0e, 0x77, 0xdb, 0x94, 0xf0, 0xcb, 0x19, 0x6f, 0xc3,
	0xfb, 0x1e, 0xb5, 0xc7, 0x9c, 0x7f, 0x44, 0xbd, 0x71, 0x63, 0xc5, 0x73, 0xc0, 0x0d, 0xf4, 0x28,
	0xa5, 0xd8, 0xef, 0x0e, 0x9f, 0x07, 0x3e, 0xe3, 0x39, 0x64, 0x47, 0x3e, 0x4b, 0x69, 0x16, 0xf8,
	0xaf, 0xa8, 0xdf, 0x7c, 0x32, 0xc6, 0x73, 0x60, 0xec, 0xd8, 0xc1, 0x58, 0x4a, 0x19, 0x0b, 0x3d,
	0xaf, 0xff, 0x43, 0x30, 0xfa, 0x13, 0x00, 0x00, 0xff, 0xff, 0x75, 0x5e, 0xc1, 0xae, 0xde, 0x01,
	0x00, 0x00,
}
