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

// A relationship between an ad group and a label.
type AdGroupLabel struct {
	// The resource name of the ad group label.
	// Ad group label resource names have the form:
	// `customers/{customer_id}/adGroupLabels/{ad_group_id}~{label_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The ad group to which the label is attached.
	AdGroup *wrappers.StringValue `protobuf:"bytes,2,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
	// The label assigned to the ad group.
	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 *AdGroupLabel) Reset()         { *m = AdGroupLabel{} }
func (m *AdGroupLabel) String() string { return proto.CompactTextString(m) }
func (*AdGroupLabel) ProtoMessage()    {}
func (*AdGroupLabel) Descriptor() ([]byte, []int) {
	return fileDescriptor_cc4fee60b3e79c3f, []int{0}
}

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

var xxx_messageInfo_AdGroupLabel proto.InternalMessageInfo

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

func (m *AdGroupLabel) GetAdGroup() *wrappers.StringValue {
	if m != nil {
		return m.AdGroup
	}
	return nil
}

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

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

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

var fileDescriptor_cc4fee60b3e79c3f = []byte{
	// 376 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x4a, 0xf3, 0x40,
	0x14, 0xc5, 0x49, 0xca, 0xf7, 0x2f, 0x5f, 0x5d, 0x98, 0x55, 0x2d, 0x45, 0x5a, 0xa5, 0xd0, 0xd5,
	0x0c, 0x34, 0xa0, 0x30, 0xae, 0xd2, 0x4d, 0x41, 0x44, 0x4a, 0x85, 0x2c, 0x24, 0x10, 0xa6, 0xc9,
	0x38, 0x04, 0x92, 0x99, 0x30, 0x93, 0xd4, 0x45, 0xe9, 0xc2, 0x57, 0x71, 0xe9, 0xa3, 0xf8, 0x28,
	0x7d, 0x08, 0x91, 0x64, 0x32, 0xd3, 0x76, 0xa3, 0xee, 0x4e, 0x72, 0x7f, 0xe7, 0xde, 0x73, 0x73,
	0xe3, 0x5c, 0x51, 0xce, 0x69, 0x46, 0x20, 0x4e, 0x24, 0x54, 0xb2, 0x56, 0x6b, 0x0f, 0x0a, 0x22,
	0x79, 0x25, 0x62, 0x22, 0x21, 0x4e, 0x22, 0x2a, 0x78, 0x55, 0x44, 0x19, 0x5e, 0x91, 0x0c, 0x14,
	0x82, 0x97, 0xdc, 0x1d, 0x29, 0x18, 0xe0, 0x44, 0x02, 0xe3, 0x03, 0x6b, 0x0f, 0x18, 0x5f, 0xff,
	0x4c, 0xb7, 0x2e, 0x52, 0xd3, 0x4d, 0xb9, 0xfb, 0xe7, 0x6d, 0xa9, 0x79, 0x5a, 0x55, 0x4f, 0xf0,
	0x59, 0xe0, 0xa2, 0x20, 0x42, 0xb6, 0xf5, 0xc1, 0x81, 0x15, 0x33, 0xc6, 0x4b, 0x5c, 0xa6, 0x9c,
	0xb5, 0xd5, 0x8b, 0x17, 0xdb, 0xe9, 0xfa, 0xc9, 0xbc, 0xce, 0x74, 0x57, 0x47, 0x72, 0x2f, 0x9d,
	0x13, 0x3d, 0x20, 0x62, 0x38, 0x27, 0x3d, 0x6b, 0x68, 0x4d, 0xfe, 0x2d, 0xbb, 0xfa, 0xe5, 0x3d,
	0xce, 0x89, 0x7b, 0xed, 0xfc, 0xd5, 0x9b, 0xf4, 0xec, 0xa1, 0x35, 0xf9, 0x3f, 0x1d, 0xb4, 0xc9,
	0x81, 0x8e, 0x01, 0x1e, 0x4a, 0x91, 0x32, 0x1a, 0xe0, 0xac, 0x22, 0xcb, 0x3f, 0x58, 0x8d, 0x70,
	0xa7, 0xce, 0xaf, 0x66, 0xf3, 0x5e, 0xe7, 0x07, 0x2e, 0x85, 0xa2, 0x68, 0xe7, 0x87, 0xce, 0x78,
	0xff, 0x61, 0x5a, 0x55, 0xa4, 0x12, 0xc4, 0x3c, 0x87, 0x47, 0xe9, 0xbd, 0xb8, 0x92, 0x25, 0xcf,
	0x89, 0x90, 0x70, 0xa3, 0xe5, 0x16, 0xe2, 0x03, 0x44, 0xc2, 0xcd, 0xf1, 0x11, 0xb6, 0xb3, 0x0f,
	0xcb, 0x19, 0xc7, 0x3c, 0x07, 0xdf, 0x9e, 0x61, 0x76, 0x7a, 0x38, 0x6c, 0x51, 0x67, 0x5e, 0x58,
	0x8f, 0xb7, 0xad, 0x8f, 0xf2, 0x0c, 0x33, 0x0a, 0xb8, 0xa0, 0x90, 0x12, 0xd6, 0x6c, 0x04, 0xf7,
	0x59, 0xbf, 0xf8, 0x2b, 0x6e, 0x8c, 0x7a, 0xb5, 0x3b, 0x73, 0xdf, 0x7f, 0xb3, 0x47, 0x73, 0xd5,
	0xd2, 0x4f, 0x24, 0x50, 0xb2, 0x56, 0x81, 0x07, 0x96, 0x9a, 0x7c, 0xd7, 0x4c, 0xe8, 0x27, 0x32,
	0x34, 0x4c, 0x18, 0x78, 0xa1, 0x61, 0x76, 0xf6, 0x58, 0x15, 0x10, 0xf2, 0x13, 0x89, 0x90, 0xa1,
	0x10, 0x0a, 0x3c, 0x84, 0x0c, 0xb7, 0xfa, 0xdd, 0x84, 0xf5, 0x3e, 0x03, 0x00, 0x00, 0xff, 0xff,
	0x54, 0x2f, 0x32, 0x48, 0xc1, 0x02, 0x00, 0x00,
}
