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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
	_ "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 customer client link relationship.
type CustomerClientLink struct {
	// Name of the resource.
	// CustomerClientLink resource names have the form:
	// `customers/{customer_id}/customerClientLinks/{client_customer_id}~{manager_link_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The client customer linked to this customer.
	ClientCustomer *wrappers.StringValue `protobuf:"bytes,3,opt,name=client_customer,json=clientCustomer,proto3" json:"client_customer,omitempty"`
	// This is uniquely identifies a customer client link. Read only.
	ManagerLinkId *wrappers.Int64Value `protobuf:"bytes,4,opt,name=manager_link_id,json=managerLinkId,proto3" json:"manager_link_id,omitempty"`
	// This is the status of the link between client and manager.
	Status enums.ManagerLinkStatusEnum_ManagerLinkStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.ManagerLinkStatusEnum_ManagerLinkStatus" json:"status,omitempty"`
	// The visibility of the link. Users can choose whether or not to see hidden
	// links in the AdWords UI.
	// Default value is false
	Hidden               *wrappers.BoolValue `protobuf:"bytes,6,opt,name=hidden,proto3" json:"hidden,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_CustomerClientLink proto.InternalMessageInfo

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

func (m *CustomerClientLink) GetClientCustomer() *wrappers.StringValue {
	if m != nil {
		return m.ClientCustomer
	}
	return nil
}

func (m *CustomerClientLink) GetManagerLinkId() *wrappers.Int64Value {
	if m != nil {
		return m.ManagerLinkId
	}
	return nil
}

func (m *CustomerClientLink) GetStatus() enums.ManagerLinkStatusEnum_ManagerLinkStatus {
	if m != nil {
		return m.Status
	}
	return enums.ManagerLinkStatusEnum_UNSPECIFIED
}

func (m *CustomerClientLink) GetHidden() *wrappers.BoolValue {
	if m != nil {
		return m.Hidden
	}
	return nil
}

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

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

var fileDescriptor_19b00c28e6d68d63 = []byte{
	// 478 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x5d, 0x6b, 0x13, 0x41,
	0x14, 0x65, 0x13, 0x0d, 0xb8, 0xda, 0x16, 0xf6, 0xc5, 0x35, 0x16, 0x49, 0x95, 0x42, 0x40, 0x98,
	0x81, 0xac, 0x28, 0x8c, 0x82, 0x6c, 0x42, 0x2d, 0x15, 0x95, 0x92, 0x42, 0x1e, 0x24, 0x18, 0xa6,
	0x3b, 0xe3, 0x3a, 0x74, 0x77, 0x66, 0x9d, 0x99, 0xad, 0x0f, 0xd2, 0x37, 0x7f, 0x89, 0x8f, 0xfe,
	0x14, 0xf1, 0x97, 0xf4, 0x57, 0x48, 0xe6, 0x2b, 0x91, 0x18, 0x7d, 0xbb, 0x99, 0x7b, 0xce, 0xb9,
	0xe7, 0xdc, 0xdc, 0x8d, 0x5f, 0x94, 0x42, 0x94, 0x15, 0x85, 0x98, 0x28, 0x68, 0xcb, 0x65, 0x75,
	0x99, 0x41, 0x49, 0x95, 0x68, 0x65, 0x41, 0x15, 0x2c, 0x5a, 0xa5, 0x45, 0x4d, 0xe5, 0xa2, 0xa8,
	0x18, 0xe5, 0x7a, 0x51, 0x31, 0x7e, 0x01, 0x1a, 0x29, 0xb4, 0x48, 0x0e, 0x2c, 0x05, 0x60, 0xa2,
	0x40, 0x60, 0x83, 0xcb, 0x0c, 0x04, 0x76, 0xff, 0xd9, 0xb6, 0x01, 0x94, 0xb7, 0xb5, 0x82, 0x35,
	0xe6, 0xb8, 0xa4, 0xd2, 0x88, 0x2e, 0x94, 0xc6, 0xba, 0x55, 0x56, 0xbb, 0x7f, 0xcf, 0x13, 0x1b,
	0x16, 0xcc, 0xb8, 0xd6, 0x03, 0xd7, 0x32, 0xbf, 0xce, 0xdb, 0x8f, 0xf0, 0x8b, 0xc4, 0x4d, 0x43,
	0xa5, 0xa7, 0xee, 0xaf, 0x51, 0x31, 0xe7, 0x42, 0x63, 0xcd, 0x04, 0x77, 0xdd, 0x87, 0xbf, 0xba,
	0x71, 0x32, 0x71, 0x99, 0x26, 0x26, 0xd2, 0x1b, 0xc6, 0x2f, 0x92, 0x47, 0xf1, 0x8e, 0x1f, 0xb3,
	0xe0, 0xb8, 0xa6, 0x69, 0x34, 0x88, 0x86, 0xb7, 0xa6, 0x77, 0xfc, 0xe3, 0x3b, 0x5c, 0xd3, 0xe4,
	0x28, 0xde, 0x73, 0x5b, 0xf0, 0x5b, 0x49, 0xbb, 0x83, 0x68, 0x78, 0x7b, 0xb4, 0xef, 0xf2, 0x03,
	0xef, 0x09, 0x9c, 0x69, 0xc9, 0x78, 0x39, 0xc3, 0x55, 0x4b, 0xa7, 0xbb, 0x96, 0xe4, 0xa7, 0x26,
	0x93, 0x78, 0xef, 0x8f, 0xe0, 0x8c, 0xa4, 0x37, 0x8c, 0xcc, 0xfd, 0x0d, 0x99, 0x13, 0xae, 0x9f,
	0x3e, 0xb1, 0x2a, 0x3b, 0x8e, 0xb3, 0xb4, 0x7b, 0x42, 0x92, 0x0f, 0x71, 0xcf, 0x2e, 0x2c, 0xbd,
	0x39, 0x88, 0x86, 0xbb, 0xa3, 0x57, 0x60, 0xdb, 0xbf, 0x61, 0x56, 0x0d, 0xde, 0xae, 0xd8, 0x67,
	0x86, 0x77, 0xc4, 0xdb, 0x7a, 0xf3, 0x75, 0xea, 0x54, 0x93, 0x51, 0xdc, 0xfb, 0xc4, 0x08, 0xa1,
	0x3c, 0xed, 0x19, 0x6f, 0xfd, 0x0d, 0x6f, 0x63, 0x21, 0x2a, 0x6b, 0xcd, 0x21, 0xd1, 0xe7, 0xeb,
	0x9c, 0xc7, 0x8f, 0x57, 0xc3, 0x5d, 0xd5, 0x30, 0x05, 0x0a, 0x51, 0xc3, 0xbf, 0xac, 0xfd, 0xa5,
	0x5f, 0xa4, 0x82, 0x5f, 0x7d, 0x79, 0x15, 0x6e, 0x6e, 0x05, 0x5c, 0x6b, 0xaf, 0x1f, 0xe2, 0xd5,
	0xf8, 0x5b, 0x27, 0x3e, 0x2c, 0x44, 0x0d, 0xfe, 0x7b, 0x8a, 0xe3, 0xbb, 0x9b, 0xe3, 0x4f, 0x97,
	0x51, 0x4e, 0xa3, 0xf7, 0xaf, 0x1d, 0xbb, 0x14, 0x15, 0xe6, 0x25, 0x10, 0xb2, 0x84, 0x25, 0xe5,
	0x26, 0x28, 0x5c, 0x65, 0xf8, 0xc7, 0x57, 0xf2, 0x3c, 0x54, 0xdf, 0x3b, 0xdd, 0xe3, 0x3c, 0xff,
	0xd1, 0x39, 0x38, 0xb6, 0x92, 0x39, 0x51, 0xc0, 0x96, 0xcb, 0x6a, 0x96, 0x81, 0xa9, 0x47, 0xfe,
	0xf4, 0x98, 0x79, 0x4e, 0xd4, 0x3c, 0x60, 0xe6, 0xb3, 0x6c, 0x1e, 0x30, 0xd7, 0x9d, 0x43, 0xdb,
	0x40, 0x28, 0x27, 0x0a, 0xa1, 0x80, 0x42, 0x68, 0x96, 0x21, 0x14, 0x70, 0xe7, 0x3d, 0x63, 0x36,
	0xfb, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x0a, 0xf8, 0x4a, 0xd1, 0x03, 0x00, 0x00,
}
