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

package resources // import "google.golang.org/genproto/googleapis/ads/googleads/v0/resources"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import wrappers "github.com/golang/protobuf/ptypes/wrappers"
import common "google.golang.org/genproto/googleapis/ads/googleads/v0/common"
import enums "google.golang.org/genproto/googleapis/ads/googleads/v0/enums"

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

// A criterion belonging to a shared set.
type SharedCriterion struct {
	// The resource name of the shared criterion.
	// Shared set resource names have the form:
	//
	// `customers/{customer_id}/sharedCriteria/{shared_set_id}_{criterion_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The shared set to which the shared criterion belongs.
	SharedSet *wrappers.StringValue `protobuf:"bytes,2,opt,name=shared_set,json=sharedSet,proto3" json:"shared_set,omitempty"`
	// The ID of the criterion.
	//
	// This field is ignored for mutates.
	CriterionId *wrappers.Int64Value `protobuf:"bytes,26,opt,name=criterion_id,json=criterionId,proto3" json:"criterion_id,omitempty"`
	// The type of the criterion.
	Type enums.CriterionTypeEnum_CriterionType `protobuf:"varint,4,opt,name=type,proto3,enum=google.ads.googleads.v0.enums.CriterionTypeEnum_CriterionType" json:"type,omitempty"`
	// The criterion.
	//
	// Exactly one must be set.
	//
	// Types that are valid to be assigned to Criterion:
	//	*SharedCriterion_Keyword
	//	*SharedCriterion_YoutubeVideo
	//	*SharedCriterion_YoutubeChannel
	//	*SharedCriterion_Placement
	Criterion            isSharedCriterion_Criterion `protobuf_oneof:"criterion"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *SharedCriterion) Reset()         { *m = SharedCriterion{} }
func (m *SharedCriterion) String() string { return proto.CompactTextString(m) }
func (*SharedCriterion) ProtoMessage()    {}
func (*SharedCriterion) Descriptor() ([]byte, []int) {
	return fileDescriptor_shared_criterion_6f71aadda527e84b, []int{0}
}
func (m *SharedCriterion) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SharedCriterion.Unmarshal(m, b)
}
func (m *SharedCriterion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SharedCriterion.Marshal(b, m, deterministic)
}
func (dst *SharedCriterion) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SharedCriterion.Merge(dst, src)
}
func (m *SharedCriterion) XXX_Size() int {
	return xxx_messageInfo_SharedCriterion.Size(m)
}
func (m *SharedCriterion) XXX_DiscardUnknown() {
	xxx_messageInfo_SharedCriterion.DiscardUnknown(m)
}

var xxx_messageInfo_SharedCriterion proto.InternalMessageInfo

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

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

func (m *SharedCriterion) GetCriterionId() *wrappers.Int64Value {
	if m != nil {
		return m.CriterionId
	}
	return nil
}

func (m *SharedCriterion) GetType() enums.CriterionTypeEnum_CriterionType {
	if m != nil {
		return m.Type
	}
	return enums.CriterionTypeEnum_UNSPECIFIED
}

type isSharedCriterion_Criterion interface {
	isSharedCriterion_Criterion()
}

type SharedCriterion_Keyword struct {
	Keyword *common.KeywordInfo `protobuf:"bytes,3,opt,name=keyword,proto3,oneof"`
}

type SharedCriterion_YoutubeVideo struct {
	YoutubeVideo *common.YouTubeVideoInfo `protobuf:"bytes,5,opt,name=youtube_video,json=youtubeVideo,proto3,oneof"`
}

type SharedCriterion_YoutubeChannel struct {
	YoutubeChannel *common.YouTubeChannelInfo `protobuf:"bytes,6,opt,name=youtube_channel,json=youtubeChannel,proto3,oneof"`
}

type SharedCriterion_Placement struct {
	Placement *common.PlacementInfo `protobuf:"bytes,7,opt,name=placement,proto3,oneof"`
}

func (*SharedCriterion_Keyword) isSharedCriterion_Criterion() {}

func (*SharedCriterion_YoutubeVideo) isSharedCriterion_Criterion() {}

func (*SharedCriterion_YoutubeChannel) isSharedCriterion_Criterion() {}

func (*SharedCriterion_Placement) isSharedCriterion_Criterion() {}

func (m *SharedCriterion) GetCriterion() isSharedCriterion_Criterion {
	if m != nil {
		return m.Criterion
	}
	return nil
}

func (m *SharedCriterion) GetKeyword() *common.KeywordInfo {
	if x, ok := m.GetCriterion().(*SharedCriterion_Keyword); ok {
		return x.Keyword
	}
	return nil
}

func (m *SharedCriterion) GetYoutubeVideo() *common.YouTubeVideoInfo {
	if x, ok := m.GetCriterion().(*SharedCriterion_YoutubeVideo); ok {
		return x.YoutubeVideo
	}
	return nil
}

func (m *SharedCriterion) GetYoutubeChannel() *common.YouTubeChannelInfo {
	if x, ok := m.GetCriterion().(*SharedCriterion_YoutubeChannel); ok {
		return x.YoutubeChannel
	}
	return nil
}

func (m *SharedCriterion) GetPlacement() *common.PlacementInfo {
	if x, ok := m.GetCriterion().(*SharedCriterion_Placement); ok {
		return x.Placement
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*SharedCriterion) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _SharedCriterion_OneofMarshaler, _SharedCriterion_OneofUnmarshaler, _SharedCriterion_OneofSizer, []interface{}{
		(*SharedCriterion_Keyword)(nil),
		(*SharedCriterion_YoutubeVideo)(nil),
		(*SharedCriterion_YoutubeChannel)(nil),
		(*SharedCriterion_Placement)(nil),
	}
}

func _SharedCriterion_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*SharedCriterion)
	// criterion
	switch x := m.Criterion.(type) {
	case *SharedCriterion_Keyword:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Keyword); err != nil {
			return err
		}
	case *SharedCriterion_YoutubeVideo:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.YoutubeVideo); err != nil {
			return err
		}
	case *SharedCriterion_YoutubeChannel:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.YoutubeChannel); err != nil {
			return err
		}
	case *SharedCriterion_Placement:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Placement); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("SharedCriterion.Criterion has unexpected type %T", x)
	}
	return nil
}

func _SharedCriterion_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*SharedCriterion)
	switch tag {
	case 3: // criterion.keyword
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(common.KeywordInfo)
		err := b.DecodeMessage(msg)
		m.Criterion = &SharedCriterion_Keyword{msg}
		return true, err
	case 5: // criterion.youtube_video
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(common.YouTubeVideoInfo)
		err := b.DecodeMessage(msg)
		m.Criterion = &SharedCriterion_YoutubeVideo{msg}
		return true, err
	case 6: // criterion.youtube_channel
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(common.YouTubeChannelInfo)
		err := b.DecodeMessage(msg)
		m.Criterion = &SharedCriterion_YoutubeChannel{msg}
		return true, err
	case 7: // criterion.placement
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(common.PlacementInfo)
		err := b.DecodeMessage(msg)
		m.Criterion = &SharedCriterion_Placement{msg}
		return true, err
	default:
		return false, nil
	}
}

func _SharedCriterion_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*SharedCriterion)
	// criterion
	switch x := m.Criterion.(type) {
	case *SharedCriterion_Keyword:
		s := proto.Size(x.Keyword)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SharedCriterion_YoutubeVideo:
		s := proto.Size(x.YoutubeVideo)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SharedCriterion_YoutubeChannel:
		s := proto.Size(x.YoutubeChannel)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *SharedCriterion_Placement:
		s := proto.Size(x.Placement)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

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

func init() {
	proto.RegisterFile("google/ads/googleads/v0/resources/shared_criterion.proto", fileDescriptor_shared_criterion_6f71aadda527e84b)
}

var fileDescriptor_shared_criterion_6f71aadda527e84b = []byte{
	// 498 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xdf, 0x8a, 0xd3, 0x40,
	0x14, 0x87, 0x4d, 0xb7, 0xee, 0xd2, 0x69, 0x77, 0x17, 0x82, 0x17, 0xa1, 0x8a, 0x74, 0x15, 0xa1,
	0x20, 0x3b, 0x09, 0x55, 0x44, 0x58, 0x58, 0x68, 0x17, 0xa9, 0x55, 0x94, 0x92, 0x2e, 0x15, 0xa5,
	0x52, 0xa6, 0xc9, 0xd9, 0x6c, 0x30, 0x99, 0x09, 0x33, 0x49, 0x97, 0xbe, 0x8e, 0x97, 0x3e, 0x8a,
	0x6f, 0xe0, 0xbd, 0x0f, 0x22, 0x99, 0x7f, 0x8b, 0x4a, 0xad, 0x77, 0xa7, 0xa7, 0xbf, 0xef, 0xcb,
	0x39, 0xc9, 0x0c, 0x7a, 0x99, 0x30, 0x96, 0x64, 0xe0, 0x93, 0x58, 0xf8, 0xaa, 0xac, 0xab, 0x75,
	0xe0, 0x73, 0x10, 0xac, 0xe2, 0x11, 0x08, 0x5f, 0x5c, 0x13, 0x0e, 0xf1, 0x32, 0xe2, 0x69, 0x09,
	0x3c, 0x65, 0x14, 0x17, 0x9c, 0x95, 0xcc, 0x3d, 0x51, 0x71, 0x4c, 0x62, 0x81, 0x2d, 0x89, 0xd7,
	0x01, 0xb6, 0x64, 0xf7, 0x74, 0x9b, 0x3c, 0x62, 0x79, 0xce, 0xa8, 0xaf, 0x95, 0x44, 0x19, 0xbb,
	0x83, 0x6d, 0x71, 0xa0, 0x55, 0x2e, 0x7c, 0x3b, 0xc0, 0xb2, 0xdc, 0x14, 0xa0, 0x99, 0x87, 0x9a,
	0x91, 0xbf, 0x56, 0xd5, 0x95, 0x7f, 0xc3, 0x49, 0x51, 0x00, 0x17, 0xea, 0xff, 0x47, 0x3f, 0x9b,
	0xe8, 0x78, 0x26, 0x17, 0xb8, 0x30, 0xb8, 0xfb, 0x18, 0x1d, 0x9a, 0x19, 0x97, 0x94, 0xe4, 0xe0,
	0x39, 0x3d, 0xa7, 0xdf, 0x0a, 0x3b, 0xa6, 0xf9, 0x9e, 0xe4, 0xe0, 0x9e, 0x21, 0xa4, 0x17, 0x17,
	0x50, 0x7a, 0x8d, 0x9e, 0xd3, 0x6f, 0x0f, 0x1e, 0xe8, 0x45, 0xb1, 0x79, 0x1a, 0x9e, 0x95, 0x3c,
	0xa5, 0xc9, 0x9c, 0x64, 0x15, 0x84, 0x2d, 0x95, 0x9f, 0x41, 0xe9, 0x9e, 0xa3, 0xce, 0xed, 0xb4,
	0x69, 0xec, 0x75, 0x25, 0x7e, 0xff, 0x2f, 0x7c, 0x42, 0xcb, 0x17, 0xcf, 0x15, 0xdd, 0xb6, 0xc0,
	0x24, 0x76, 0x43, 0xd4, 0xac, 0x77, 0xf4, 0x9a, 0x3d, 0xa7, 0x7f, 0x34, 0x38, 0xc7, 0xdb, 0x5e,
	0xb5, 0x7c, 0x31, 0xd8, 0x6e, 0x76, 0xb9, 0x29, 0xe0, 0x15, 0xad, 0xf2, 0xdf, 0x3b, 0xa1, 0x74,
	0xb9, 0x63, 0x74, 0xf0, 0x05, 0x36, 0x37, 0x8c, 0xc7, 0xde, 0x9e, 0x1c, 0xe7, 0xe9, 0x56, 0xad,
	0xfa, 0x3c, 0xf8, 0xad, 0x8a, 0x4f, 0xe8, 0x15, 0x7b, 0x7d, 0x27, 0x34, 0xb4, 0xfb, 0x01, 0x1d,
	0x6e, 0x58, 0x55, 0x56, 0x2b, 0x58, 0xae, 0xd3, 0x18, 0x98, 0x77, 0x57, 0xea, 0x82, 0x5d, 0xba,
	0x8f, 0xac, 0xba, 0xac, 0x56, 0x30, 0xaf, 0x19, 0xed, 0xec, 0x68, 0x91, 0xec, 0xb9, 0x9f, 0xd1,
	0xb1, 0x11, 0x47, 0xd7, 0x84, 0x52, 0xc8, 0xbc, 0x7d, 0xa9, 0x1e, 0xfc, 0xa7, 0xfa, 0x42, 0x51,
	0x5a, 0x7e, 0xa4, 0x65, 0xba, 0xeb, 0xbe, 0x43, 0xad, 0x22, 0x23, 0x11, 0xe4, 0x40, 0x4b, 0xef,
	0x40, 0x8a, 0x4f, 0x77, 0x89, 0xa7, 0x06, 0xd0, 0xce, 0x5b, 0xc3, 0xa8, 0x8d, 0x5a, 0xf6, 0x93,
	0x8d, 0x7e, 0x38, 0xe8, 0x49, 0xc4, 0x72, 0xbc, 0xf3, 0x4e, 0x8c, 0xee, 0xfd, 0x71, 0x1a, 0xa7,
	0xf5, 0x59, 0x98, 0x3a, 0x9f, 0xde, 0x68, 0x34, 0x61, 0x19, 0xa1, 0x09, 0x66, 0x3c, 0xf1, 0x13,
	0xa0, 0xf2, 0xa4, 0x98, 0xcb, 0x50, 0xa4, 0xe2, 0x1f, 0xf7, 0xf4, 0xcc, 0x56, 0x5f, 0x1b, 0x7b,
	0xe3, 0xe1, 0xf0, 0x5b, 0xe3, 0x64, 0xac, 0x94, 0xc3, 0x58, 0x60, 0x55, 0xd6, 0xd5, 0x3c, 0xc0,
	0xa1, 0x49, 0x7e, 0x37, 0x99, 0xc5, 0x30, 0x16, 0x0b, 0x9b, 0x59, 0xcc, 0x83, 0x85, 0xcd, 0xac,
	0xf6, 0xe5, 0x10, 0xcf, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x5c, 0x15, 0x3a, 0x23, 0x2b, 0x04,
	0x00, 0x00,
}
