// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/label.proto

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
	_ "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

// A label.
type Label struct {
	// Name of the resource.
	// Label resource names have the form:
	// `customers/{customer_id}/labels/{label_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Id of the label. Read only.
	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// The name of the label.
	//
	// This field is required and should not be empty when creating a new label.
	//
	// The length of this string should be between 1 and 80, inclusive.
	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// Status of the label. Read only.
	Status enums.LabelStatusEnum_LabelStatus `protobuf:"varint,4,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.LabelStatusEnum_LabelStatus" json:"status,omitempty"`
	// A type of label displaying text on a colored background.
	TextLabel            *common.TextLabel `protobuf:"bytes,5,opt,name=text_label,json=textLabel,proto3" json:"text_label,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Label proto.InternalMessageInfo

func (m *Label) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func (m *Label) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *Label) GetName() *wrappers.StringValue {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *Label) GetStatus() enums.LabelStatusEnum_LabelStatus {
	if m != nil {
		return m.Status
	}
	return enums.LabelStatusEnum_UNSPECIFIED
}

func (m *Label) GetTextLabel() *common.TextLabel {
	if m != nil {
		return m.TextLabel
	}
	return nil
}

func init() {
	proto.RegisterType((*Label)(nil), "google.ads.googleads.v3.resources.Label")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/label.proto", fileDescriptor_218eb3ad030af589)
}

var fileDescriptor_218eb3ad030af589 = []byte{
	// 452 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcb, 0x6a, 0xdc, 0x30,
	0x14, 0x86, 0xb1, 0x73, 0x81, 0xa8, 0x97, 0x85, 0x57, 0xd3, 0x34, 0x84, 0x49, 0x4b, 0x60, 0x4a,
	0xa9, 0x14, 0xe2, 0xd2, 0x85, 0xba, 0x72, 0x20, 0x24, 0x2d, 0xa5, 0x04, 0xa7, 0xcc, 0xa2, 0x18,
	0x06, 0x8d, 0xad, 0x1a, 0x83, 0x25, 0x19, 0x49, 0x4e, 0x03, 0x21, 0x2f, 0xd3, 0x65, 0x1f, 0xa5,
	0x8f, 0x32, 0xdb, 0x2e, 0xba, 0x2d, 0xd6, 0x6d, 0x06, 0x8a, 0x9b, 0xd5, 0xfc, 0x9a, 0xf3, 0xfd,
	0xbf, 0x8e, 0xcf, 0x11, 0x78, 0x53, 0x0b, 0x51, 0xb7, 0x14, 0x91, 0x4a, 0x21, 0x2b, 0x07, 0x75,
	0x93, 0x22, 0x49, 0x95, 0xe8, 0x65, 0x49, 0x15, 0x6a, 0xc9, 0x92, 0xb6, 0xb0, 0x93, 0x42, 0x8b,
	0xe4, 0xc8, 0x32, 0x90, 0x54, 0x0a, 0x06, 0x1c, 0xde, 0xa4, 0x30, 0xe0, 0xfb, 0x68, 0x2c, 0xb1,
	0x14, 0x8c, 0x09, 0x8e, 0x34, 0xbd, 0xd5, 0x8b, 0x8d, 0xcc, 0xfd, 0x93, 0x31, 0x03, 0xe5, 0x3d,
	0x73, 0xd7, 0x2f, 0x94, 0x26, 0xba, 0x57, 0xce, 0xf1, 0xcc, 0x3b, 0xba, 0x26, 0xf4, 0xe9, 0x4a,
	0x87, 0xae, 0x64, 0x4e, 0xcb, 0xfe, 0x1b, 0xfa, 0x2e, 0x49, 0xd7, 0x51, 0xe9, 0xad, 0x07, 0x1b,
	0x56, 0xc2, 0xb9, 0xd0, 0x44, 0x37, 0x82, 0xbb, 0xea, 0x8b, 0xdf, 0x31, 0xd8, 0xf9, 0x34, 0xdc,
	0x97, 0xbc, 0x04, 0x4f, 0x7c, 0xf2, 0x82, 0x13, 0x46, 0x27, 0xd1, 0x34, 0x9a, 0xed, 0xe5, 0x8f,
	0xfd, 0x9f, 0x9f, 0x09, 0xa3, 0xc9, 0x6b, 0x10, 0x37, 0xd5, 0x24, 0x9e, 0x46, 0xb3, 0x47, 0xa7,
	0xcf, 0xdd, 0x3c, 0xa0, 0xbf, 0x19, 0x7e, 0xe0, 0xfa, 0xdd, 0xdb, 0x39, 0x69, 0x7b, 0x9a, 0xc7,
	0x4d, 0x95, 0x9c, 0x80, 0x6d, 0x13, 0xb4, 0x65, 0xf0, 0x83, 0x7f, 0xf0, 0x6b, 0x2d, 0x1b, 0x5e,
	0x5b, 0xde, 0x90, 0x49, 0x0e, 0x76, 0xed, 0x67, 0x4f, 0xb6, 0xa7, 0xd1, 0xec, 0xe9, 0x29, 0x86,
	0x63, 0xd3, 0x37, 0x93, 0x82, 0xa6, 0xf3, 0x6b, 0xe3, 0x38, 0xe7, 0x3d, 0xdb, 0x3c, 0xe7, 0x2e,
	0x29, 0xb9, 0x04, 0x60, 0xbd, 0x80, 0xc9, 0x8e, 0xe9, 0xe5, 0xd5, 0x68, 0xae, 0x5d, 0x19, 0xfc,
	0x42, 0x6f, 0xb5, 0x09, 0xcb, 0xf7, 0xb4, 0x97, 0xf8, 0x72, 0x95, 0x9d, 0x83, 0xc3, 0x35, 0xee,
	0x54, 0xd7, 0xa8, 0xc1, 0x86, 0xdc, 0x18, 0xcb, 0x5e, 0x69, 0xc1, 0xa8, 0x54, 0xe8, 0xce, 0xcb,
	0x7b, 0xbb, 0x52, 0x85, 0xee, 0xcc, 0xef, 0xfd, 0xd9, 0x9f, 0x08, 0x1c, 0x97, 0x82, 0xc1, 0x07,
	0xdf, 0xd6, 0x19, 0x30, 0xa9, 0x57, 0xc3, 0xc8, 0xae, 0xa2, 0xaf, 0x1f, 0x9d, 0xa1, 0x16, 0x2d,
	0xe1, 0x35, 0x14, 0xb2, 0x46, 0x35, 0xe5, 0x66, 0xa0, 0x68, 0xdd, 0xcd, 0x7f, 0x9e, 0xf6, 0xfb,
	0xa0, 0x7e, 0xc4, 0x5b, 0x17, 0x59, 0xf6, 0x33, 0x3e, 0xba, 0xb0, 0x91, 0x59, 0xa5, 0xa0, 0x95,
	0x83, 0x9a, 0xa7, 0x30, 0xf7, 0xe4, 0x2f, 0xcf, 0x14, 0x59, 0xa5, 0x8a, 0xc0, 0x14, 0xf3, 0xb4,
	0x08, 0xcc, 0x2a, 0x3e, 0xb6, 0x05, 0x8c, 0xb3, 0x4a, 0x61, 0x1c, 0x28, 0x8c, 0xe7, 0x29, 0xc6,
	0x81, 0x5b, 0xee, 0x9a, 0x66, 0xd3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x99, 0xa2, 0x1f, 0x9f,
	0x86, 0x03, 0x00, 0x00,
}
