// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/services/shopping_performance_view_service.proto

package services

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	resources "google.golang.org/genproto/googleapis/ads/googleads/v2/resources"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
)

// 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

// Request message for
// [ShoppingPerformanceViewService.GetShoppingPerformanceView][google.ads.googleads.v2.services.ShoppingPerformanceViewService.GetShoppingPerformanceView].
type GetShoppingPerformanceViewRequest struct {
	// The resource name of the Shopping performance view to fetch.
	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 *GetShoppingPerformanceViewRequest) Reset()         { *m = GetShoppingPerformanceViewRequest{} }
func (m *GetShoppingPerformanceViewRequest) String() string { return proto.CompactTextString(m) }
func (*GetShoppingPerformanceViewRequest) ProtoMessage()    {}
func (*GetShoppingPerformanceViewRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b48bc0ab6a318568, []int{0}
}

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

var xxx_messageInfo_GetShoppingPerformanceViewRequest proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*GetShoppingPerformanceViewRequest)(nil), "google.ads.googleads.v2.services.GetShoppingPerformanceViewRequest")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/services/shopping_performance_view_service.proto", fileDescriptor_b48bc0ab6a318568)
}

var fileDescriptor_b48bc0ab6a318568 = []byte{
	// 399 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x3f, 0x6b, 0xdb, 0x40,
	0x18, 0xc6, 0x91, 0x0a, 0x85, 0x8a, 0x76, 0xd1, 0x52, 0xa3, 0x96, 0xe2, 0xda, 0x1e, 0x4a, 0x87,
	0x3b, 0x50, 0x87, 0xd2, 0x2b, 0xa5, 0xc8, 0x1d, 0xec, 0xa9, 0x18, 0x1b, 0x34, 0x14, 0x81, 0xb8,
	0x4a, 0x6f, 0x94, 0x03, 0xeb, 0x4e, 0xb9, 0x93, 0xe5, 0x21, 0x64, 0xc9, 0x98, 0x35, 0x7b, 0x86,
	0x8c, 0xf9, 0x28, 0x5e, 0xb3, 0x67, 0xca, 0x94, 0x4f, 0x11, 0xe4, 0xd3, 0xc9, 0x49, 0x40, 0xf6,
	0xf6, 0x70, 0xf7, 0xdc, 0xef, 0x79, 0xff, 0x9c, 0x33, 0xcd, 0x84, 0xc8, 0x96, 0x80, 0x69, 0xaa,
	0xb0, 0x96, 0xb5, 0xaa, 0x7c, 0xac, 0x40, 0x56, 0x2c, 0x01, 0x85, 0xd5, 0xb1, 0x28, 0x0a, 0xc6,
	0xb3, 0xb8, 0x00, 0x79, 0x24, 0x64, 0x4e, 0x79, 0x02, 0x71, 0xc5, 0x60, 0x1d, 0x37, 0x16, 0x54,
	0x48, 0x51, 0x0a, 0xb7, 0xaf, 0x9f, 0x23, 0x9a, 0x2a, 0xd4, 0x92, 0x50, 0xe5, 0x23, 0x43, 0xf2,
	0x82, 0xae, 0x2c, 0x09, 0x4a, 0xac, 0xe4, 0xde, 0x30, 0x1d, 0xe2, 0x7d, 0x34, 0x88, 0x82, 0x61,
	0xca, 0xb9, 0x28, 0x69, 0xc9, 0x04, 0x57, 0xcd, 0xed, 0xfb, 0x27, 0xb7, 0xc9, 0x92, 0x01, 0x2f,
	0xf5, 0xc5, 0x60, 0xea, 0x7c, 0x9e, 0x40, 0xb9, 0x68, 0xe0, 0xb3, 0x1d, 0x3b, 0x64, 0xb0, 0x9e,
	0xc3, 0xc9, 0x0a, 0x54, 0xe9, 0x0e, 0x9d, 0x77, 0xa6, 0x90, 0x98, 0xd3, 0x1c, 0x7a, 0x56, 0xdf,
	0xfa, 0xf2, 0x66, 0xfe, 0xd6, 0x1c, 0xfe, 0xa5, 0x39, 0xf8, 0x57, 0xb6, 0xf3, 0xa9, 0x83, 0xb3,
	0xd0, 0x7d, 0xba, 0x77, 0x96, 0xe3, 0x75, 0xa7, 0xb9, 0x7f, 0xd0, 0xa1, 0x41, 0xa1, 0x83, 0xb5,
	0x7a, 0xa4, 0x13, 0xd2, 0xce, 0x12, 0x75, 0x20, 0x06, 0xbf, 0xcf, 0x6f, 0xef, 0x2f, 0xed, 0x1f,
	0xee, 0xf7, 0x7a, 0xf4, 0xa7, 0xcf, 0x5a, 0xfe, 0x95, 0xac, 0x54, 0x29, 0x72, 0x90, 0x0a, 0x7f,
	0x6d, 0x77, 0xf1, 0xe2, 0xfd, 0x99, 0xf7, 0x61, 0x13, 0xf4, 0x76, 0x99, 0x8d, 0x2a, 0x98, 0x42,
	0x89, 0xc8, 0xc7, 0x17, 0xb6, 0x33, 0x4a, 0x44, 0x7e, 0xb0, 0xc9, 0xf1, 0x70, 0xff, 0x18, 0x67,
	0xf5, 0xe2, 0x66, 0xd6, 0xbf, 0xe6, 0x83, 0xa2, 0x4c, 0x2c, 0x29, 0xcf, 0x90, 0x90, 0x19, 0xce,
	0x80, 0x6f, 0xd7, 0x8a, 0x77, 0xd1, 0xdd, 0xff, 0xf7, 0xa7, 0x11, 0xd7, 0xf6, 0xab, 0x49, 0x10,
	0xdc, 0xd8, 0xfd, 0x89, 0x06, 0x06, 0xa9, 0x42, 0x5a, 0xd6, 0x2a, 0xf4, 0x51, 0x13, 0xac, 0x36,
	0xc6, 0x12, 0x05, 0xa9, 0x8a, 0x5a, 0x4b, 0x14, 0xfa, 0x91, 0xb1, 0x3c, 0xd8, 0x23, 0x7d, 0x4e,
	0x48, 0x90, 0x2a, 0x42, 0x5a, 0x13, 0x21, 0xa1, 0x4f, 0x88, 0xb1, 0xfd, 0x7f, 0xbd, 0xad, 0xf3,
	0xdb, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x38, 0x73, 0xb3, 0xf5, 0x66, 0x03, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// ShoppingPerformanceViewServiceClient is the client API for ShoppingPerformanceViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ShoppingPerformanceViewServiceClient interface {
	// Returns the requested Shopping performance view in full detail.
	GetShoppingPerformanceView(ctx context.Context, in *GetShoppingPerformanceViewRequest, opts ...grpc.CallOption) (*resources.ShoppingPerformanceView, error)
}

type shoppingPerformanceViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewShoppingPerformanceViewServiceClient(cc grpc.ClientConnInterface) ShoppingPerformanceViewServiceClient {
	return &shoppingPerformanceViewServiceClient{cc}
}

func (c *shoppingPerformanceViewServiceClient) GetShoppingPerformanceView(ctx context.Context, in *GetShoppingPerformanceViewRequest, opts ...grpc.CallOption) (*resources.ShoppingPerformanceView, error) {
	out := new(resources.ShoppingPerformanceView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v2.services.ShoppingPerformanceViewService/GetShoppingPerformanceView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ShoppingPerformanceViewServiceServer is the server API for ShoppingPerformanceViewService service.
type ShoppingPerformanceViewServiceServer interface {
	// Returns the requested Shopping performance view in full detail.
	GetShoppingPerformanceView(context.Context, *GetShoppingPerformanceViewRequest) (*resources.ShoppingPerformanceView, error)
}

// UnimplementedShoppingPerformanceViewServiceServer can be embedded to have forward compatible implementations.
type UnimplementedShoppingPerformanceViewServiceServer struct {
}

func (*UnimplementedShoppingPerformanceViewServiceServer) GetShoppingPerformanceView(ctx context.Context, req *GetShoppingPerformanceViewRequest) (*resources.ShoppingPerformanceView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetShoppingPerformanceView not implemented")
}

func RegisterShoppingPerformanceViewServiceServer(s *grpc.Server, srv ShoppingPerformanceViewServiceServer) {
	s.RegisterService(&_ShoppingPerformanceViewService_serviceDesc, srv)
}

func _ShoppingPerformanceViewService_GetShoppingPerformanceView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetShoppingPerformanceViewRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ShoppingPerformanceViewServiceServer).GetShoppingPerformanceView(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v2.services.ShoppingPerformanceViewService/GetShoppingPerformanceView",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ShoppingPerformanceViewServiceServer).GetShoppingPerformanceView(ctx, req.(*GetShoppingPerformanceViewRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ShoppingPerformanceViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v2.services.ShoppingPerformanceViewService",
	HandlerType: (*ShoppingPerformanceViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetShoppingPerformanceView",
			Handler:    _ShoppingPerformanceViewService_GetShoppingPerformanceView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v2/services/shopping_performance_view_service.proto",
}
