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

// Possible statuses of a label.
type LabelStatusEnum_LabelStatus int32

const (
	// Not specified.
	LabelStatusEnum_UNSPECIFIED LabelStatusEnum_LabelStatus = 0
	// Used for return value only. Represents value unknown in this version.
	LabelStatusEnum_UNKNOWN LabelStatusEnum_LabelStatus = 1
	// Label is enabled.
	LabelStatusEnum_ENABLED LabelStatusEnum_LabelStatus = 2
	// Label is removed.
	LabelStatusEnum_REMOVED LabelStatusEnum_LabelStatus = 3
)

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

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

func (x LabelStatusEnum_LabelStatus) String() string {
	return proto.EnumName(LabelStatusEnum_LabelStatus_name, int32(x))
}

func (LabelStatusEnum_LabelStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d2f43f327476a4c8, []int{0, 0}
}

// Container for enum describing possible status of a label.
type LabelStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabelStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.LabelStatusEnum_LabelStatus", LabelStatusEnum_LabelStatus_name, LabelStatusEnum_LabelStatus_value)
	proto.RegisterType((*LabelStatusEnum)(nil), "google.ads.googleads.v3.enums.LabelStatusEnum")
}

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

var fileDescriptor_d2f43f327476a4c8 = []byte{
	// 294 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x6b, 0xbb, 0x30,
	0x18, 0xfe, 0x69, 0xe1, 0x37, 0x88, 0x87, 0x8a, 0xc7, 0xb1, 0x1e, 0xda, 0x0f, 0x90, 0x0c, 0x72,
	0xcb, 0x4e, 0x71, 0x66, 0xa5, 0xac, 0xb3, 0xb2, 0x52, 0x37, 0x86, 0x30, 0xd2, 0x29, 0x41, 0xd0,
	0x44, 0x1a, 0xed, 0x07, 0xda, 0x71, 0x1f, 0x65, 0xdf, 0x63, 0x97, 0x7d, 0x8a, 0x91, 0x58, 0xa5,
	0x97, 0xed, 0x22, 0xcf, 0xfb, 0x3e, 0x7f, 0x7c, 0xf2, 0x82, 0x6b, 0xa1, 0x94, 0xa8, 0x0a, 0xc4,
	0x73, 0x8d, 0x7a, 0x68, 0xd0, 0x11, 0xa3, 0x42, 0x76, 0xb5, 0x46, 0x15, 0xdf, 0x17, 0xd5, 0xab,
	0x6e, 0x79, 0xdb, 0x69, 0xd8, 0x1c, 0x54, 0xab, 0x82, 0x59, 0x2f, 0x83, 0x3c, 0xd7, 0x70, 0x74,
	0xc0, 0x23, 0x86, 0xd6, 0x71, 0x79, 0x35, 0x04, 0x36, 0x25, 0xe2, 0x52, 0xaa, 0x96, 0xb7, 0xa5,
	0x92, 0x27, 0xf3, 0xe2, 0x19, 0x4c, 0xd7, 0x26, 0x72, 0x6b, 0x13, 0x99, 0xec, 0xea, 0x05, 0x03,
	0xde, 0xd9, 0x2a, 0x98, 0x02, 0x6f, 0x17, 0x6f, 0x13, 0x76, 0xbb, 0xba, 0x5b, 0xb1, 0xc8, 0xff,
	0x17, 0x78, 0xe0, 0x62, 0x17, 0xdf, 0xc7, 0x9b, 0xa7, 0xd8, 0x77, 0xcc, 0xc0, 0x62, 0x1a, 0xae,
	0x59, 0xe4, 0xbb, 0x66, 0x78, 0x64, 0x0f, 0x9b, 0x94, 0x45, 0xfe, 0x24, 0xfc, 0x72, 0xc0, 0xfc,
	0x4d, 0xd5, 0xf0, 0xcf, 0x76, 0xa1, 0x7f, 0xf6, 0xab, 0xc4, 0x34, 0x4a, 0x9c, 0x97, 0xf0, 0x64,
	0x11, 0xaa, 0xe2, 0x52, 0x40, 0x75, 0x10, 0x48, 0x14, 0xd2, 0xf6, 0x1d, 0x4e, 0xd2, 0x94, 0xfa,
	0x97, 0x0b, 0xdd, 0xd8, 0xef, 0xbb, 0x3b, 0x59, 0x52, 0xfa, 0xe1, 0xce, 0x96, 0x7d, 0x14, 0xcd,
	0x35, 0xec, 0xa1, 0x41, 0x29, 0x86, 0xe6, 0xa5, 0xfa, 0x73, 0xe0, 0x33, 0x9a, 0xeb, 0x6c, 0xe4,
	0xb3, 0x14, 0x67, 0x96, 0xff, 0x76, 0xe7, 0xfd, 0x92, 0x10, 0x9a, 0x6b, 0x42, 0x46, 0x05, 0x21,
	0x29, 0x26, 0xc4, 0x6a, 0xf6, 0xff, 0x6d, 0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x21, 0x43,
	0x8c, 0x14, 0xb9, 0x01, 0x00, 0x00,
}
