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

// SharedSets are used for sharing criterion exclusions across multiple
// campaigns.
type SharedSet struct {
	// The resource name of the shared set.
	// Shared set resource names have the form:
	//
	// `customers/{customer_id}/sharedSets/{shared_set_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The ID of this shared set. Read only.
	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// The type of this shared set: each shared set holds only a single kind
	// of resource. Required. Immutable.
	Type enums.SharedSetTypeEnum_SharedSetType `protobuf:"varint,3,opt,name=type,proto3,enum=google.ads.googleads.v3.enums.SharedSetTypeEnum_SharedSetType" json:"type,omitempty"`
	// The name of this shared set. Required.
	// Shared Sets must have names that are unique among active shared sets of
	// the same type.
	// The length of this string should be between 1 and 255 UTF-8 bytes,
	// inclusive.
	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// The status of this shared set. Read only.
	Status enums.SharedSetStatusEnum_SharedSetStatus `protobuf:"varint,5,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.SharedSetStatusEnum_SharedSetStatus" json:"status,omitempty"`
	// The number of shared criteria within this shared set. Read only.
	MemberCount *wrappers.Int64Value `protobuf:"bytes,6,opt,name=member_count,json=memberCount,proto3" json:"member_count,omitempty"`
	// The number of campaigns associated with this shared set. Read only.
	ReferenceCount       *wrappers.Int64Value `protobuf:"bytes,7,opt,name=reference_count,json=referenceCount,proto3" json:"reference_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_SharedSet proto.InternalMessageInfo

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

func (m *SharedSet) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *SharedSet) GetType() enums.SharedSetTypeEnum_SharedSetType {
	if m != nil {
		return m.Type
	}
	return enums.SharedSetTypeEnum_UNSPECIFIED
}

func (m *SharedSet) GetName() *wrappers.StringValue {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *SharedSet) GetStatus() enums.SharedSetStatusEnum_SharedSetStatus {
	if m != nil {
		return m.Status
	}
	return enums.SharedSetStatusEnum_UNSPECIFIED
}

func (m *SharedSet) GetMemberCount() *wrappers.Int64Value {
	if m != nil {
		return m.MemberCount
	}
	return nil
}

func (m *SharedSet) GetReferenceCount() *wrappers.Int64Value {
	if m != nil {
		return m.ReferenceCount
	}
	return nil
}

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

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

var fileDescriptor_4d9291edd18f8ee2 = []byte{
	// 502 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xd1, 0x6a, 0xd4, 0x40,
	0x14, 0x25, 0xe9, 0xba, 0xd2, 0x69, 0x5d, 0x21, 0x4f, 0x6b, 0x2d, 0xb2, 0xad, 0x14, 0x16, 0x94,
	0x19, 0xd9, 0xa8, 0x0f, 0x11, 0x0a, 0x59, 0x95, 0xa2, 0x0f, 0x52, 0xb2, 0xba, 0x0f, 0x65, 0x61,
	0x99, 0x4d, 0x6e, 0x63, 0x60, 0x33, 0x13, 0x66, 0x26, 0x95, 0x52, 0xfa, 0x27, 0x3e, 0xf9, 0xe8,
	0xa7, 0xf8, 0x29, 0xfd, 0x05, 0x5f, 0x24, 0x33, 0x93, 0xd9, 0x16, 0x69, 0xb7, 0x6f, 0x27, 0x73,
	0xcf, 0x39, 0xf7, 0xdc, 0x9b, 0x19, 0x34, 0xca, 0x39, 0xcf, 0x97, 0x40, 0x68, 0x26, 0x89, 0x81,
	0x0d, 0x3a, 0x0b, 0x89, 0x00, 0xc9, 0x6b, 0x91, 0x82, 0x24, 0xf2, 0x3b, 0x15, 0x90, 0xcd, 0x25,
	0x28, 0x5c, 0x09, 0xae, 0x78, 0xb0, 0x67, 0x88, 0x98, 0x66, 0x12, 0x3b, 0x0d, 0x3e, 0x0b, 0xb1,
	0xd3, 0xec, 0xbc, 0xb9, 0xcd, 0x16, 0x58, 0x5d, 0x5e, 0xb7, 0x9c, 0x4b, 0x45, 0x55, 0x2d, 0x8d,
	0xf3, 0x4e, 0x78, 0x6f, 0x99, 0x3a, 0xaf, 0xc0, 0x8a, 0x9e, 0xb4, 0xa2, 0xaa, 0x70, 0xa9, 0x6d,
	0xe9, 0x99, 0x2d, 0xe9, 0xaf, 0x45, 0x7d, 0x4a, 0x7e, 0x08, 0x5a, 0x55, 0x20, 0xda, 0x7e, 0xbb,
	0xd7, 0xa4, 0x94, 0x31, 0xae, 0xa8, 0x2a, 0x38, 0xb3, 0xd5, 0xfd, 0x9f, 0x1d, 0xb4, 0x39, 0xd1,
	0x2d, 0x27, 0xa0, 0x82, 0xe7, 0xe8, 0x51, 0xeb, 0x3e, 0x67, 0xb4, 0x84, 0xbe, 0x37, 0xf0, 0x86,
	0x9b, 0xc9, 0x76, 0x7b, 0xf8, 0x85, 0x96, 0x10, 0xbc, 0x40, 0x7e, 0x91, 0xf5, 0xfd, 0x81, 0x37,
	0xdc, 0x1a, 0x3d, 0xb5, 0xcb, 0xc1, 0x6d, 0x77, 0xfc, 0x89, 0xa9, 0xb7, 0xaf, 0xa7, 0x74, 0x59,
	0x43, 0xe2, 0x17, 0x59, 0x90, 0xa0, 0x4e, 0x33, 0x46, 0x7f, 0x63, 0xe0, 0x0d, 0x7b, 0xa3, 0x43,
	0x7c, 0xdb, 0x5a, 0xf5, 0xf0, 0xd8, 0x25, 0xf9, 0x7a, 0x5e, 0xc1, 0x47, 0x56, 0x97, 0x37, 0x4f,
	0x12, 0xed, 0x15, 0xbc, 0x42, 0x1d, 0x1d, 0xae, 0xa3, 0x23, 0xec, 0xfe, 0x17, 0x61, 0xa2, 0x44,
	0xc1, 0x72, 0x93, 0x41, 0x33, 0x83, 0x13, 0xd4, 0x35, 0xff, 0xa0, 0xff, 0x40, 0xe7, 0x18, 0xdf,
	0x37, 0xc7, 0x44, 0xab, 0x6e, 0x26, 0x31, 0x67, 0x89, 0x75, 0x0c, 0x0e, 0xd1, 0x76, 0x09, 0xe5,
	0x02, 0xc4, 0x3c, 0xe5, 0x35, 0x53, 0xfd, 0xee, 0xfa, 0xc5, 0x6c, 0x19, 0xc1, 0xfb, 0x86, 0x1f,
	0x7c, 0x40, 0x8f, 0x05, 0x9c, 0x82, 0x00, 0x96, 0x82, 0xb5, 0x78, 0xb8, 0xde, 0xa2, 0xe7, 0x34,
	0xda, 0x25, 0xfa, 0x76, 0x15, 0x27, 0x68, 0x7f, 0x35, 0x8a, 0x45, 0x55, 0x21, 0x71, 0xca, 0x4b,
	0xb2, 0xfa, 0xc5, 0x2f, 0xd3, 0x5a, 0x2a, 0x5e, 0x82, 0x90, 0xe4, 0xa2, 0x85, 0x97, 0xf6, 0xd6,
	0x4d, 0x40, 0x49, 0x72, 0xb1, 0xba, 0x81, 0x97, 0xe3, 0xbf, 0x1e, 0x3a, 0x48, 0x79, 0x89, 0xd7,
	0xbe, 0x86, 0x71, 0xcf, 0xb5, 0x38, 0x6e, 0xe2, 0x1e, 0x7b, 0x27, 0x9f, 0xad, 0x28, 0xe7, 0x4b,
	0xca, 0x72, 0xcc, 0x45, 0x4e, 0x72, 0x60, 0x7a, 0x18, 0xb2, 0x8a, 0x77, 0xc7, 0xab, 0x7c, 0xe7,
	0xd0, 0x2f, 0x7f, 0xe3, 0x28, 0x8e, 0x7f, 0xfb, 0x7b, 0x47, 0xc6, 0x32, 0xce, 0x24, 0x36, 0xb0,
	0x41, 0xd3, 0x10, 0x27, 0x2d, 0xf3, 0x4f, 0xcb, 0x99, 0xc5, 0x99, 0x9c, 0x39, 0xce, 0x6c, 0x1a,
	0xce, 0x1c, 0xe7, 0xca, 0x3f, 0x30, 0x85, 0x28, 0x8a, 0x33, 0x19, 0x45, 0x8e, 0x15, 0x45, 0xd3,
	0x30, 0x8a, 0x1c, 0x6f, 0xd1, 0xd5, 0x61, 0xc3, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x31, 0xc7,
	0xf7, 0x69, 0x41, 0x04, 0x00, 0x00,
}
