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

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

var xxx_messageInfo_AdGroupCriterionLabel proto.InternalMessageInfo

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

func (m *AdGroupCriterionLabel) GetAdGroupCriterion() *wrappers.StringValue {
	if m != nil {
		return m.AdGroupCriterion
	}
	return nil
}

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

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

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

var fileDescriptor_f4fb81627fc685a6 = []byte{
	// 390 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xdf, 0x4a, 0xf3, 0x30,
	0x1c, 0xa5, 0x1d, 0xdf, 0x07, 0x5f, 0x3f, 0x05, 0x29, 0x08, 0x73, 0x0c, 0xd9, 0x94, 0xc1, 0xae,
	0x12, 0x58, 0xef, 0xe2, 0x8d, 0x9d, 0xe0, 0x60, 0x88, 0x8c, 0x09, 0xbd, 0x90, 0x42, 0xc9, 0xda,
	0x18, 0x0a, 0x6d, 0x52, 0x92, 0x76, 0x0a, 0x63, 0xd7, 0xbe, 0x87, 0x97, 0xbe, 0x81, 0xaf, 0xe0,
	0xa3, 0xec, 0x29, 0xa4, 0x7f, 0x12, 0x87, 0xce, 0x3f, 0x77, 0xa7, 0xfd, 0x9d, 0x73, 0x7e, 0xe7,
	0x24, 0xb1, 0xce, 0x29, 0xe7, 0x34, 0x21, 0x10, 0x47, 0x12, 0xd6, 0xb0, 0x44, 0x4b, 0x07, 0x0a,
	0x22, 0x79, 0x21, 0x42, 0x22, 0x21, 0x8e, 0x02, 0x2a, 0x78, 0x91, 0x05, 0xa1, 0x88, 0x73, 0x22,
	0x62, 0xce, 0x82, 0x04, 0x2f, 0x48, 0x02, 0x32, 0xc1, 0x73, 0x6e, 0xf7, 0x6b, 0x19, 0xc0, 0x91,
	0x04, 0xda, 0x01, 0x2c, 0x1d, 0xa0, 0x1d, 0x3a, 0x47, 0x6a, 0x49, 0x16, 0x6b, 0xdf, 0x5a, 0xdd,
	0x39, 0x6e, 0x46, 0xd5, 0xd7, 0xa2, 0xb8, 0x83, 0xf7, 0x02, 0x67, 0x19, 0x11, 0xb2, 0x99, 0x77,
	0xb7, 0xa4, 0x98, 0x31, 0x9e, 0xe3, 0x3c, 0xe6, 0xac, 0x99, 0x9e, 0xbc, 0x98, 0xd6, 0xa1, 0x1b,
	0x4d, 0xca, 0x74, 0x17, 0x2a, 0xdc, 0x55, 0x99, 0xcd, 0x3e, 0xb5, 0xf6, 0xd5, 0xa6, 0x80, 0xe1,
	0x94, 0xb4, 0x8d, 0x9e, 0x31, 0xfc, 0x37, 0xdf, 0x53, 0x3f, 0xaf, 0x71, 0x4a, 0xec, 0xa9, 0x65,
	0x7f, 0x2e, 0xd7, 0x36, 0x7b, 0xc6, 0xf0, 0xff, 0xa8, 0xdb, 0x94, 0x01, 0x2a, 0x19, 0xb8, 0xc9,
	0x45, 0xcc, 0xa8, 0x87, 0x93, 0x82, 0xcc, 0x0f, 0xf0, 0x87, 0xad, 0xf6, 0xc8, 0xfa, 0x53, 0x9d,
	0x4a, 0xbb, 0xf5, 0x0b, 0x79, 0x4d, 0x45, 0xab, 0x8d, 0xfb, 0x60, 0x6d, 0x1d, 0x5a, 0x83, 0xb2,
	0x58, 0x82, 0x90, 0xa7, 0x70, 0x77, 0xb3, 0xcb, 0xb0, 0x90, 0x39, 0x4f, 0x89, 0x90, 0x70, 0xa5,
	0xe0, 0x1a, 0xe2, 0x5d, 0x5c, 0x09, 0x57, 0x5f, 0x5d, 0xde, 0x7a, 0xfc, 0x68, 0x5a, 0x83, 0x90,
	0xa7, 0xe0, 0xc7, 0xeb, 0x1b, 0x77, 0x76, 0x06, 0x99, 0x95, 0xc5, 0x66, 0xc6, 0xed, 0xb4, 0x31,
	0xa0, 0x3c, 0xc1, 0x8c, 0x02, 0x2e, 0x28, 0xa4, 0x84, 0x55, 0xb5, 0xe1, 0x7b, 0xa1, 0x6f, 0x1e,
	0xd8, 0x99, 0x46, 0x4f, 0x66, 0x6b, 0xe2, 0xba, 0xcf, 0x66, 0x7f, 0x52, 0x5b, 0xba, 0x91, 0x04,
	0x35, 0x2c, 0x91, 0xe7, 0x80, 0xb9, 0x62, 0xbe, 0x2a, 0x8e, 0xef, 0x46, 0xd2, 0xd7, 0x1c, 0xdf,
	0x73, 0x7c, 0xcd, 0xd9, 0x98, 0x83, 0x7a, 0x80, 0x90, 0x1b, 0x49, 0x84, 0x34, 0x0b, 0x21, 0xcf,
	0x41, 0x48, 0xf3, 0x16, 0x7f, 0xab, 0xb0, 0xce, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0xec,
	0x97, 0xa1, 0x0c, 0x03, 0x00, 0x00,
}
