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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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

// Represents a relationship between a customer and a label. This customer may
// not have access to all the labels attached to it. Additional CustomerLabels
// may be returned by increasing permissions with login-customer-id.
type CustomerLabel struct {
	// Name of the resource.
	// Customer label resource names have the form:
	// `customers/{customer_id}/customerLabels/{label_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The resource name of the customer to which the label is attached.
	// Read only.
	Customer *wrappers.StringValue `protobuf:"bytes,2,opt,name=customer,proto3" json:"customer,omitempty"`
	// The resource name of the label assigned to the customer.
	//
	// Note: the Customer ID portion of the label resource name is not
	// validated when creating a new CustomerLabel.
	Label                *wrappers.StringValue `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_CustomerLabel proto.InternalMessageInfo

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

func (m *CustomerLabel) GetCustomer() *wrappers.StringValue {
	if m != nil {
		return m.Customer
	}
	return nil
}

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

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

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

var fileDescriptor_cb93c66565bf0f10 = []byte{
	// 369 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x4a, 0xeb, 0x40,
	0x14, 0xc6, 0x49, 0xca, 0xbd, 0xdc, 0x1b, 0xed, 0x26, 0xab, 0x5a, 0x8a, 0xb4, 0x4a, 0xa5, 0xab,
	0x19, 0x68, 0x44, 0x64, 0x5c, 0xa5, 0x2e, 0x0a, 0x22, 0x52, 0x2a, 0x64, 0x21, 0xc1, 0x32, 0x4d,
	0xc6, 0x10, 0x48, 0x66, 0xc2, 0x4c, 0x52, 0x17, 0xd2, 0xa5, 0x2f, 0xe2, 0xd2, 0x47, 0xf1, 0x51,
	0xfa, 0x12, 0x4a, 0x32, 0x7f, 0xda, 0x6e, 0xd4, 0xdd, 0x97, 0x9c, 0xdf, 0x77, 0xce, 0x77, 0x66,
	0xc6, 0xb9, 0x48, 0x18, 0x4b, 0x32, 0x02, 0x71, 0x2c, 0xa0, 0x94, 0xb5, 0x5a, 0x79, 0x90, 0x13,
	0xc1, 0x2a, 0x1e, 0x11, 0x01, 0xa3, 0x4a, 0x94, 0x2c, 0x27, 0x7c, 0x91, 0xe1, 0x25, 0xc9, 0x40,
	0xc1, 0x59, 0xc9, 0xdc, 0x81, 0x84, 0x01, 0x8e, 0x05, 0x30, 0x3e, 0xb0, 0xf2, 0x80, 0xf1, 0x75,
	0x8f, 0x74, 0xeb, 0x22, 0x35, 0xdd, 0xa4, 0xbb, 0x7b, 0xac, 0x4a, 0xcd, 0xd7, 0xb2, 0x7a, 0x82,
	0xcf, 0x1c, 0x17, 0x05, 0xe1, 0x42, 0xd5, 0x7b, 0x3b, 0x56, 0x4c, 0x29, 0x2b, 0x71, 0x99, 0x32,
	0xaa, 0xaa, 0x27, 0xaf, 0xb6, 0xd3, 0xbe, 0x56, 0xa1, 0x6e, 0xeb, 0x4c, 0xee, 0xa9, 0xd3, 0xd6,
	0x13, 0x16, 0x14, 0xe7, 0xa4, 0x63, 0xf5, 0xad, 0xd1, 0xff, 0xf9, 0xa1, 0xfe, 0x79, 0x87, 0x73,
	0xe2, 0x5e, 0x3a, 0xff, 0xf4, 0x2a, 0x1d, 0xbb, 0x6f, 0x8d, 0x0e, 0xc6, 0x3d, 0x15, 0x1d, 0xe8,
	0x1c, 0xe0, 0xbe, 0xe4, 0x29, 0x4d, 0x02, 0x9c, 0x55, 0x64, 0x6e, 0x68, 0x77, 0xec, 0xfc, 0x69,
	0x76, 0xef, 0xb4, 0x7e, 0x61, 0x93, 0x28, 0xc2, 0x1b, 0xff, 0xd1, 0x39, 0xdb, 0x1e, 0x8d, 0x52,
	0x45, 0x2a, 0x40, 0xc4, 0x72, 0xb8, 0x9f, 0xff, 0x5c, 0x8f, 0x12, 0xf0, 0x45, 0xcb, 0xb5, 0x39,
	0xf8, 0x86, 0xd9, 0xa9, 0xc8, 0x8b, 0x58, 0x4f, 0x3e, 0x2d, 0x67, 0x18, 0xb1, 0x1c, 0xfc, 0x78,
	0x15, 0x13, 0x77, 0x6f, 0xdc, 0xac, 0x8e, 0x3d, 0xb3, 0x1e, 0x6e, 0x94, 0x31, 0x61, 0x19, 0xa6,
	0x09, 0x60, 0x3c, 0x81, 0x09, 0xa1, 0xcd, 0x52, 0x70, 0x1b, 0xf7, 0x9b, 0xa7, 0x71, 0x65, 0xd4,
	0x9b, 0xdd, 0x9a, 0xfa, 0xfe, 0xbb, 0x3d, 0x98, 0xca, 0x96, 0x7e, 0x2c, 0x80, 0x94, 0xb5, 0x0a,
	0x3c, 0x30, 0xd7, 0xe4, 0x87, 0x66, 0x42, 0x3f, 0x16, 0xa1, 0x61, 0xc2, 0xc0, 0x0b, 0x0d, 0xb3,
	0xb1, 0x87, 0xb2, 0x80, 0x90, 0x1f, 0x0b, 0x84, 0x0c, 0x85, 0x50, 0xe0, 0x21, 0x64, 0xb8, 0xe5,
	0xdf, 0x26, 0xac, 0xf7, 0x15, 0x00, 0x00, 0xff, 0xff, 0x73, 0xf2, 0x1e, 0xa2, 0xc6, 0x02, 0x00,
	0x00,
}
