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

package resources

import (
	fmt "fmt"
	math "math"

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

// Shopping performance view.
// Provides Shopping campaign statistics aggregated at several product dimension
// levels. Product dimension values from Merchant Center such as brand,
// category, custom attributes, product condition and product type will reflect
// the state of each dimension as of the date and time when the corresponding
// event was recorded.
type ShoppingPerformanceView struct {
	// The resource name of the Shopping performance view.
	// Shopping performance view resource names have the form:
	// `customers/{customer_id}/shoppingPerformanceView`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ShoppingPerformanceView proto.InternalMessageInfo

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

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

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

var fileDescriptor_f485d5704344bc86 = []byte{
	// 323 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0xf3, 0x40,
	0x10, 0xc7, 0x49, 0x3e, 0xf8, 0xc0, 0xa0, 0x97, 0x5e, 0xd4, 0xd2, 0x83, 0x55, 0x0a, 0x1e, 0x64,
	0x57, 0xc8, 0x6d, 0x3d, 0x6d, 0x2f, 0x05, 0x0f, 0x52, 0x2a, 0xe4, 0x20, 0x81, 0xba, 0x26, 0xeb,
	0x1a, 0x68, 0x76, 0x96, 0x9d, 0xb4, 0x3d, 0x88, 0x0f, 0xe0, 0x6b, 0xe8, 0xcd, 0x47, 0xf1, 0x51,
	0xfa, 0x14, 0xd2, 0x6e, 0x77, 0x23, 0x42, 0xf5, 0xf6, 0x27, 0xf3, 0x9b, 0xdf, 0x4c, 0x66, 0x13,
	0xae, 0x00, 0xd4, 0x4c, 0x52, 0x51, 0x22, 0x75, 0x71, 0x9d, 0x16, 0x29, 0xb5, 0x12, 0x61, 0x6e,
	0x0b, 0x89, 0x14, 0x9f, 0xc0, 0x98, 0x4a, 0xab, 0xa9, 0x91, 0xf6, 0x11, 0x6c, 0x2d, 0x74, 0x21,
	0xa7, 0x8b, 0x4a, 0x2e, 0x89, 0xb1, 0xd0, 0x40, 0xa7, 0xef, 0xfa, 0x88, 0x28, 0x91, 0x04, 0x05,
	0x59, 0xa4, 0x24, 0x28, 0xba, 0xc7, 0x7e, 0x8a, 0xa9, 0x82, 0xd8, 0x75, 0x77, 0x7b, 0xdf, 0x4a,
	0x42, 0x6b, 0x68, 0x44, 0x53, 0x81, 0x46, 0x57, 0x3d, 0x7d, 0x8f, 0x92, 0xc3, 0xdb, 0xed, 0xfc,
	0x71, 0x3b, 0x3e, 0xab, 0xe4, 0xb2, 0x73, 0x96, 0x1c, 0x78, 0xd7, 0x54, 0x8b, 0x5a, 0x1e, 0x45,
	0x27, 0xd1, 0xf9, 0xde, 0x64, 0xdf, 0x7f, 0xbc, 0x11, 0xb5, 0x64, 0xc5, 0x8a, 0xdf, 0x27, 0x97,
	0xed, 0x5a, 0xdb, 0x64, 0x2a, 0x24, 0x05, 0xd4, 0x74, 0x97, 0xfb, 0xa2, 0x98, 0x63, 0x03, 0xb5,
	0xb4, 0x48, 0x9f, 0x7d, 0x7c, 0x09, 0x97, 0xf8, 0x41, 0x0f, 0x5f, 0xe3, 0x64, 0x50, 0x40, 0x4d,
	0xfe, 0x3c, 0xc4, 0xb0, 0xb7, 0x63, 0xe0, 0x78, 0xfd, 0xb7, 0xe3, 0xe8, 0xee, 0x7a, 0xab, 0x50,
	0x30, 0x13, 0x5a, 0x11, 0xb0, 0x8a, 0x2a, 0xa9, 0x37, 0xb7, 0xa0, 0xed, 0xea, 0xbf, 0xbc, 0xd6,
	0x55, 0x48, 0x6f, 0xf1, 0xbf, 0x11, 0xe7, 0x1f, 0x71, 0x7f, 0xe4, 0x94, 0xbc, 0x44, 0xe2, 0xe2,
	0x3a, 0x65, 0x29, 0x99, 0x78, 0xf2, 0xd3, 0x33, 0x39, 0x2f, 0x31, 0x0f, 0x4c, 0x9e, 0xa5, 0x79,
	0x60, 0x56, 0xf1, 0xc0, 0x15, 0x18, 0xe3, 0x25, 0x32, 0x16, 0x28, 0xc6, 0xb2, 0x94, 0xb1, 0xc0,
	0x3d, 0xfc, 0xdf, 0x2c, 0x9b, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x88, 0xfa, 0x29, 0x59,
	0x02, 0x00, 0x00,
}
