// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/campaign_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 campaign and a label.
type CampaignLabel struct {
	// Name of the resource.
	// Campaign label resource names have the form:
	// `customers/{customer_id}/campaignLabels/{campaign_id}~{label_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The campaign to which the label is attached.
	Campaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=campaign,proto3" json:"campaign,omitempty"`
	// The label assigned to the campaign.
	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 *CampaignLabel) Reset()         { *m = CampaignLabel{} }
func (m *CampaignLabel) String() string { return proto.CompactTextString(m) }
func (*CampaignLabel) ProtoMessage()    {}
func (*CampaignLabel) Descriptor() ([]byte, []int) {
	return fileDescriptor_b50dc695bdd1c347, []int{0}
}

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

var xxx_messageInfo_CampaignLabel proto.InternalMessageInfo

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

func (m *CampaignLabel) GetCampaign() *wrappers.StringValue {
	if m != nil {
		return m.Campaign
	}
	return nil
}

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

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

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

var fileDescriptor_b50dc695bdd1c347 = []byte{
	// 372 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x4b, 0xf3, 0x30,
	0x1c, 0xc6, 0x69, 0xc7, 0xfb, 0xa2, 0xd5, 0x5d, 0x7a, 0x9a, 0x63, 0xc8, 0xa6, 0x4c, 0x76, 0x4a,
	0x60, 0x15, 0x91, 0x78, 0xea, 0x3c, 0x0c, 0x44, 0x64, 0x4c, 0xe8, 0x41, 0x8a, 0x23, 0x6b, 0x63,
	0x28, 0xb4, 0x49, 0x49, 0xda, 0x79, 0x90, 0x1d, 0xfd, 0x22, 0x1e, 0xfd, 0x28, 0x7e, 0x94, 0x7d,
	0x09, 0xa5, 0x6d, 0x92, 0xb9, 0x8b, 0x7a, 0x7b, 0xb6, 0xe7, 0xf7, 0xfc, 0xf3, 0xfc, 0x93, 0x3a,
	0x17, 0x94, 0x73, 0x9a, 0x12, 0x88, 0x63, 0x09, 0x1b, 0x59, 0xa9, 0x95, 0x07, 0x05, 0x91, 0xbc,
	0x14, 0x11, 0x91, 0x30, 0xc2, 0x59, 0x8e, 0x13, 0xca, 0x16, 0x29, 0x5e, 0x92, 0x14, 0xe4, 0x82,
	0x17, 0xdc, 0x1d, 0x34, 0x30, 0xc0, 0xb1, 0x04, 0x26, 0x07, 0x56, 0x1e, 0x30, 0xb9, 0xee, 0x91,
	0x1e, 0x9d, 0x27, 0x66, 0x5a, 0x93, 0xee, 0x1e, 0x2b, 0xab, 0xfe, 0xb5, 0x2c, 0x9f, 0xe0, 0xb3,
	0xc0, 0x79, 0x4e, 0x84, 0x54, 0x7e, 0xef, 0x5b, 0x14, 0x33, 0xc6, 0x0b, 0x5c, 0x24, 0x9c, 0x29,
	0xf7, 0xe4, 0xd5, 0x76, 0xda, 0xd7, 0xaa, 0xd4, 0x6d, 0xd5, 0xc9, 0x3d, 0x75, 0xda, 0xfa, 0x84,
	0x05, 0xc3, 0x19, 0xe9, 0x58, 0x7d, 0x6b, 0xb4, 0x3f, 0x3f, 0xd4, 0x7f, 0xde, 0xe1, 0x8c, 0xb8,
	0x97, 0xce, 0x9e, 0x5e, 0xa5, 0x63, 0xf7, 0xad, 0xd1, 0xc1, 0xb8, 0xa7, 0xaa, 0x03, 0xdd, 0x03,
	0xdc, 0x17, 0x22, 0x61, 0x34, 0xc0, 0x69, 0x49, 0xe6, 0x86, 0x76, 0xc7, 0xce, 0xbf, 0x7a, 0xf7,
	0x4e, 0xeb, 0x0f, 0xb1, 0x06, 0x45, 0x78, 0xe3, 0x3f, 0x3a, 0x67, 0xdb, 0xab, 0x51, 0x2a, 0x4f,
	0x24, 0x88, 0x78, 0x06, 0x77, 0xfb, 0x9f, 0x47, 0xa5, 0x2c, 0x78, 0x46, 0x84, 0x84, 0x2f, 0x5a,
	0xae, 0xcd, 0xc5, 0xd7, 0x4c, 0xe5, 0xec, 0x3c, 0xc4, 0x7a, 0xf2, 0x69, 0x39, 0xc3, 0x88, 0x67,
	0xe0, 0xd7, 0xa7, 0x98, 0xb8, 0x3b, 0xc7, 0xcd, 0xaa, 0xda, 0x33, 0xeb, 0xe1, 0x46, 0x05, 0x29,
	0x4f, 0x31, 0xa3, 0x80, 0x0b, 0x0a, 0x29, 0x61, 0xf5, 0x52, 0x70, 0x5b, 0xf7, 0x87, 0x4f, 0xe3,
	0xca, 0xa8, 0x37, 0xbb, 0x35, 0xf5, 0xfd, 0x77, 0x7b, 0x30, 0x6d, 0x46, 0xfa, 0xb1, 0x04, 0x8d,
	0xac, 0x54, 0xe0, 0x81, 0xb9, 0x26, 0x3f, 0x34, 0x13, 0xfa, 0xb1, 0x0c, 0x0d, 0x13, 0x06, 0x5e,
	0x68, 0x98, 0x8d, 0x3d, 0x6c, 0x0c, 0x84, 0xfc, 0x58, 0x22, 0x64, 0x28, 0x84, 0x02, 0x0f, 0x21,
	0xc3, 0x2d, 0xff, 0xd7, 0x65, 0xbd, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xd7, 0x8a, 0xa9,
	0xc6, 0x02, 0x00, 0x00,
}
