// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/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_5962b94c654a3da4, []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.v2.resources.AdGroupCriterionLabel")
}

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

var fileDescriptor_5962b94c654a3da4 = []byte{
	// 342 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xc1, 0x4a, 0xc3, 0x30,
	0x1c, 0xc6, 0x69, 0x87, 0x82, 0x55, 0x41, 0x0a, 0xc2, 0x18, 0x43, 0x36, 0x65, 0xb0, 0x53, 0x02,
	0xf1, 0x16, 0x2f, 0x76, 0x1e, 0x06, 0x43, 0x64, 0x4c, 0xe8, 0x41, 0x0a, 0x25, 0x5b, 0x62, 0x28,
	0x74, 0x49, 0x48, 0xda, 0xf9, 0x08, 0xbe, 0x87, 0x47, 0x9f, 0xc1, 0x27, 0xf0, 0x51, 0x7c, 0x0a,
	0x69, 0xd3, 0xe4, 0xa0, 0xa2, 0xde, 0x3e, 0x9a, 0xef, 0xff, 0x7d, 0xbf, 0x7f, 0xff, 0xd1, 0x35,
	0x97, 0x92, 0x97, 0x0c, 0x12, 0x6a, 0xa0, 0x95, 0x8d, 0xda, 0x21, 0xa8, 0x99, 0x91, 0xb5, 0xde,
	0x30, 0x03, 0x09, 0xcd, 0xb9, 0x96, 0xb5, 0xca, 0x37, 0xba, 0xa8, 0x98, 0x2e, 0xa4, 0xc8, 0x4b,
	0xb2, 0x66, 0x25, 0x50, 0x5a, 0x56, 0x32, 0x1e, 0xdb, 0x31, 0x40, 0xa8, 0x01, 0x3e, 0x01, 0xec,
	0x10, 0xf0, 0x09, 0x83, 0xb3, 0xae, 0xa4, 0x1d, 0x58, 0xd7, 0x8f, 0xf0, 0x49, 0x13, 0xa5, 0x98,
	0x36, 0x36, 0x62, 0x30, 0x74, 0x10, 0xaa, 0x80, 0x44, 0x08, 0x59, 0x91, 0xaa, 0x90, 0xa2, 0x7b,
	0x3d, 0x7f, 0x0b, 0xa2, 0xd3, 0x84, 0xce, 0x1b, 0x84, 0x1b, 0x47, 0x70, 0xdb, 0x00, 0xc4, 0x17,
	0xd1, 0xb1, 0x2b, 0xc9, 0x05, 0xd9, 0xb2, 0x7e, 0x30, 0x0a, 0xa6, 0x07, 0xab, 0x23, 0xf7, 0xf1,
	0x8e, 0x6c, 0x59, 0xbc, 0x88, 0xe2, 0xef, 0x1b, 0xf4, 0xc3, 0x51, 0x30, 0x3d, 0x44, 0xc3, 0x8e,
	0x18, 0x38, 0x32, 0x70, 0x5f, 0xe9, 0x42, 0xf0, 0x94, 0x94, 0x35, 0x5b, 0x9d, 0x90, 0x2f, 0xad,
	0x31, 0x8a, 0xf6, 0xda, 0xd5, 0xfb, 0xbd, 0x7f, 0x8c, 0x5b, 0xeb, 0xec, 0x39, 0x8c, 0x26, 0x1b,
	0xb9, 0x05, 0x7f, 0xfe, 0xa6, 0xd9, 0xe0, 0xc7, 0x2d, 0x97, 0x4d, 0xf6, 0x32, 0x78, 0x58, 0x74,
	0x01, 0x5c, 0x96, 0x44, 0x70, 0x20, 0x35, 0x87, 0x9c, 0x89, 0xb6, 0xd9, 0x5d, 0x4e, 0x15, 0xe6,
	0x97, 0x43, 0x5e, 0x79, 0xf5, 0x12, 0xf6, 0xe6, 0x49, 0xf2, 0x1a, 0x8e, 0xe7, 0x36, 0x32, 0xa1,
	0x06, 0x58, 0xd9, 0xa8, 0x14, 0x81, 0x95, 0x73, 0xbe, 0x3b, 0x4f, 0x96, 0x50, 0x93, 0x79, 0x4f,
	0x96, 0xa2, 0xcc, 0x7b, 0x3e, 0xc2, 0x89, 0x7d, 0xc0, 0x38, 0xa1, 0x06, 0x63, 0xef, 0xc2, 0x38,
	0x45, 0x18, 0x7b, 0xdf, 0x7a, 0xbf, 0x85, 0xbd, 0xfc, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x91, 0x35,
	0x08, 0x53, 0x74, 0x02, 0x00, 0x00,
}
