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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	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

// A feed placeholder view.
type FeedPlaceholderView struct {
	// The resource name of the feed placeholder view.
	// Feed placeholder view resource names have the form:
	//
	// `customers/{customer_id}/feedPlaceholderViews/{placeholder_type}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The placeholder type of the feed placeholder view.
	PlaceholderType      enums.PlaceholderTypeEnum_PlaceholderType `protobuf:"varint,2,opt,name=placeholder_type,json=placeholderType,proto3,enum=google.ads.googleads.v3.enums.PlaceholderTypeEnum_PlaceholderType" json:"placeholder_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_FeedPlaceholderView proto.InternalMessageInfo

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

func (m *FeedPlaceholderView) GetPlaceholderType() enums.PlaceholderTypeEnum_PlaceholderType {
	if m != nil {
		return m.PlaceholderType
	}
	return enums.PlaceholderTypeEnum_UNSPECIFIED
}

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

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

var fileDescriptor_d5dcecda7416af9b = []byte{
	// 379 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xc1, 0x4a, 0xeb, 0x40,
	0x14, 0x25, 0x79, 0xf0, 0xe0, 0x85, 0xf7, 0x9e, 0x52, 0x37, 0xb5, 0xb8, 0x68, 0x95, 0x42, 0x17,
	0x32, 0x03, 0xc6, 0xd5, 0x88, 0x8b, 0x14, 0xb4, 0xe0, 0x42, 0x4a, 0x91, 0x2c, 0x24, 0x50, 0xc6,
	0xcc, 0x35, 0x06, 0x32, 0x33, 0x31, 0x93, 0xb4, 0x94, 0xd2, 0xa5, 0xdf, 0x21, 0xb8, 0xf4, 0x53,
	0xfc, 0x94, 0x7e, 0x85, 0x34, 0xd3, 0x4c, 0x6b, 0x69, 0x75, 0x77, 0xb8, 0xf7, 0x9c, 0x33, 0xf7,
	0xe4, 0xc4, 0xb9, 0x8c, 0xa4, 0x8c, 0x12, 0xc0, 0x94, 0x29, 0xac, 0xe1, 0x02, 0x8d, 0x5c, 0x9c,
	0x81, 0x92, 0x45, 0x16, 0x82, 0xc2, 0x8f, 0x00, 0x6c, 0x98, 0x26, 0x34, 0x84, 0x27, 0x99, 0x30,
	0xc8, 0x86, 0xa3, 0x18, 0xc6, 0x28, 0xcd, 0x64, 0x2e, 0x6b, 0x2d, 0xad, 0x41, 0x94, 0x29, 0x64,
	0xe4, 0x68, 0xe4, 0x22, 0x23, 0x6f, 0x9c, 0xef, 0x7a, 0x01, 0x44, 0xc1, 0x15, 0x5e, 0x37, 0xce,
	0x27, 0x29, 0x68, 0xe3, 0xc6, 0x61, 0xa5, 0x4a, 0x63, 0x73, 0xca, 0x72, 0x75, 0xb4, 0xb6, 0xa2,
	0x42, 0xc8, 0x9c, 0xe6, 0xb1, 0x14, 0x4a, 0x6f, 0x8f, 0x5f, 0x6d, 0xe7, 0xe0, 0x1a, 0x80, 0xf5,
	0x57, 0xbe, 0x7e, 0x0c, 0xe3, 0xda, 0x89, 0xf3, 0xaf, 0xf2, 0x19, 0x0a, 0xca, 0xa1, 0x6e, 0x35,
	0xad, 0xce, 0x9f, 0xc1, 0xdf, 0x6a, 0x78, 0x4b, 0x39, 0xd4, 0xb8, 0xb3, 0xbf, 0x79, 0x4f, 0xdd,
	0x6e, 0x5a, 0x9d, 0xff, 0x67, 0x5d, 0xb4, 0x2b, 0x69, 0x19, 0x03, 0xad, 0x3d, 0x77, 0x37, 0x49,
	0xe1, 0x4a, 0x14, 0x7c, 0x73, 0x36, 0xd8, 0x4b, 0xbf, 0x0e, 0x48, 0x3e, 0xf7, 0x9e, 0x9d, 0xd3,
	0x95, 0xdb, 0x12, 0xa5, 0xb1, 0x42, 0xa1, 0xe4, 0x78, 0x5b, 0x0c, 0x2f, 0x2c, 0x54, 0x2e, 0x39,
	0x64, 0x0a, 0x4f, 0x2b, 0x38, 0x2b, 0x2b, 0xda, 0x60, 0x2a, 0x3c, 0xdd, 0x5a, 0xdc, 0xac, 0xfb,
	0x62, 0x3b, 0xed, 0x50, 0x72, 0xf4, 0x63, 0x75, 0xdd, 0xfa, 0x96, 0x0b, 0xfa, 0x8b, 0xaf, 0xdc,
	0xb7, 0xee, 0x6f, 0x96, 0xf2, 0x48, 0x26, 0x54, 0x44, 0x48, 0x66, 0x11, 0x8e, 0x40, 0x94, 0x1d,
	0xe0, 0x55, 0x8e, 0x6f, 0xfe, 0xab, 0x0b, 0x83, 0xde, 0xec, 0x5f, 0x3d, 0xcf, 0x7b, 0xb7, 0x5b,
	0x3d, 0x6d, 0xe9, 0x31, 0x85, 0x34, 0x5c, 0x20, 0xdf, 0x45, 0x83, 0x8a, 0xf9, 0x51, 0x71, 0x02,
	0x8f, 0xa9, 0xc0, 0x70, 0x02, 0xdf, 0x0d, 0x0c, 0x67, 0x6e, 0xb7, 0xf5, 0x82, 0x10, 0x8f, 0x29,
	0x42, 0x0c, 0x8b, 0x10, 0xdf, 0x25, 0xc4, 0xf0, 0x1e, 0x7e, 0x97, 0xc7, 0xba, 0x9f, 0x01, 0x00,
	0x00, 0xff, 0xff, 0xaa, 0x95, 0xec, 0x49, 0x03, 0x03, 0x00, 0x00,
}
