// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/product_group_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/v3/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 [ProductGroupViewService.GetProductGroupView][google.ads.googleads.v3.services.ProductGroupViewService.GetProductGroupView].
type GetProductGroupViewRequest struct {
	// Required. The resource name of the product group 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 *GetProductGroupViewRequest) Reset()         { *m = GetProductGroupViewRequest{} }
func (m *GetProductGroupViewRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductGroupViewRequest) ProtoMessage()    {}
func (*GetProductGroupViewRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_a629789fd6fc67c7, []int{0}
}

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

var xxx_messageInfo_GetProductGroupViewRequest proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterFile("google/ads/googleads/v3/services/product_group_view_service.proto", fileDescriptor_a629789fd6fc67c7)
}

var fileDescriptor_a629789fd6fc67c7 = []byte{
	// 417 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0x8b, 0xd4, 0x40,
	0x1c, 0x25, 0x39, 0x10, 0x0c, 0xda, 0xc4, 0xe2, 0x8e, 0x78, 0xe0, 0x72, 0x5c, 0x71, 0x5c, 0x31,
	0x03, 0x0e, 0x36, 0xa3, 0x16, 0xb3, 0x85, 0x11, 0x04, 0x59, 0x4e, 0x48, 0x21, 0x81, 0x30, 0x97,
	0xfc, 0x8c, 0x03, 0x49, 0x26, 0xce, 0x4c, 0x72, 0x85, 0xd8, 0x68, 0x6f, 0xe3, 0x37, 0xb0, 0xf4,
	0xa3, 0x5c, 0x2b, 0x36, 0x56, 0x16, 0x56, 0x7e, 0x0a, 0xc9, 0x4d, 0x26, 0xb7, 0xbb, 0x6c, 0xd8,
	0xee, 0x31, 0xef, 0xfd, 0xde, 0xfb, 0xfd, 0x99, 0x80, 0x95, 0x52, 0x96, 0x15, 0x60, 0x5e, 0x68,
	0x6c, 0xe1, 0x80, 0x7a, 0x82, 0x35, 0xa8, 0x5e, 0xe4, 0xa0, 0x71, 0xab, 0x64, 0xd1, 0xe5, 0x26,
	0x2b, 0x95, 0xec, 0xda, 0xac, 0x17, 0x70, 0x95, 0x8d, 0x1c, 0x6a, 0x95, 0x34, 0x32, 0x5c, 0xd8,
	0x3a, 0xc4, 0x0b, 0x8d, 0x26, 0x0b, 0xd4, 0x13, 0xe4, 0x2c, 0x22, 0x3a, 0x17, 0xa2, 0x40, 0xcb,
	0x4e, 0xed, 0x4e, 0xb1, 0xee, 0xd1, 0xb1, 0xab, 0x6d, 0x05, 0xe6, 0x4d, 0x23, 0x0d, 0x37, 0x42,
	0x36, 0x7a, 0x64, 0x0f, 0xd7, 0xd8, 0xbc, 0x12, 0xd0, 0x98, 0x91, 0x78, 0xb4, 0x46, 0xbc, 0x13,
	0x50, 0x15, 0xd9, 0x25, 0xbc, 0xe7, 0xbd, 0x90, 0xca, 0x0a, 0x4e, 0x5e, 0x04, 0x51, 0x0c, 0x66,
	0x65, 0x63, 0xe3, 0x21, 0x35, 0x11, 0x70, 0x75, 0x01, 0x1f, 0x3a, 0xd0, 0x26, 0x3c, 0x0b, 0xee,
	0xbb, 0xde, 0xb2, 0x86, 0xd7, 0x70, 0xe4, 0x2d, 0xbc, 0xb3, 0xbb, 0xcb, 0x83, 0x3f, 0xcc, 0xbf,
	0xb8, 0xe7, 0x98, 0xd7, 0xbc, 0x86, 0xc7, 0x5f, 0xfd, 0xe0, 0x70, 0xdb, 0xe5, 0x8d, 0x1d, 0x3c,
	0xfc, 0xe5, 0x05, 0x0f, 0x76, 0x84, 0x84, 0xcf, 0xd0, 0xbe, 0x95, 0xa1, 0xf9, 0xde, 0x22, 0x32,
	0x5b, 0x3d, 0xad, 0x13, 0x6d, 0xd7, 0x9e, 0xbc, 0xfa, 0xcd, 0x36, 0x27, 0xfa, 0xfc, 0xf3, 0xef,
	0x37, 0xff, 0x49, 0x48, 0x86, 0x33, 0x7c, 0xdc, 0x60, 0x9e, 0xe7, 0x9d, 0x36, 0xb2, 0x06, 0xa5,
	0xf1, 0xb9, 0xbb, 0xcb, 0x64, 0xa4, 0xf1, 0xf9, 0xa7, 0xe8, 0xe1, 0x35, 0x3b, 0xba, 0x0d, 0x1e,
	0x51, 0x2b, 0x34, 0xca, 0x65, 0xbd, 0xfc, 0xe2, 0x07, 0xa7, 0xb9, 0xac, 0xf7, 0x8e, 0xb8, 0x3c,
	0x9e, 0x59, 0xdb, 0x6a, 0xb8, 0xcf, 0xca, 0x7b, 0xfb, 0x72, 0x74, 0x28, 0x65, 0xc5, 0x9b, 0x12,
	0x49, 0x55, 0xe2, 0x12, 0x9a, 0x9b, 0xeb, 0xe1, 0xdb, 0xcc, 0xf9, 0x9f, 0xfb, 0xd4, 0x81, 0xef,
	0xfe, 0x41, 0xcc, 0xd8, 0x0f, 0x7f, 0x11, 0x5b, 0x43, 0x56, 0x68, 0x64, 0xe1, 0x80, 0x12, 0x82,
	0xc6, 0x60, 0x7d, 0xed, 0x24, 0x29, 0x2b, 0x74, 0x3a, 0x49, 0xd2, 0x84, 0xa4, 0x4e, 0xf2, 0xcf,
	0x3f, 0xb5, 0xef, 0x94, 0xb2, 0x42, 0x53, 0x3a, 0x89, 0x28, 0x4d, 0x08, 0xa5, 0x4e, 0x76, 0x79,
	0xe7, 0xa6, 0x4f, 0xf2, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xf2, 0x26, 0x5d, 0xa0, 0x60, 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

// ProductGroupViewServiceClient is the client API for ProductGroupViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ProductGroupViewServiceClient interface {
	// Returns the requested product group view in full detail.
	GetProductGroupView(ctx context.Context, in *GetProductGroupViewRequest, opts ...grpc.CallOption) (*resources.ProductGroupView, error)
}

type productGroupViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewProductGroupViewServiceClient(cc grpc.ClientConnInterface) ProductGroupViewServiceClient {
	return &productGroupViewServiceClient{cc}
}

func (c *productGroupViewServiceClient) GetProductGroupView(ctx context.Context, in *GetProductGroupViewRequest, opts ...grpc.CallOption) (*resources.ProductGroupView, error) {
	out := new(resources.ProductGroupView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.ProductGroupViewService/GetProductGroupView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ProductGroupViewServiceServer is the server API for ProductGroupViewService service.
type ProductGroupViewServiceServer interface {
	// Returns the requested product group view in full detail.
	GetProductGroupView(context.Context, *GetProductGroupViewRequest) (*resources.ProductGroupView, error)
}

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

func (*UnimplementedProductGroupViewServiceServer) GetProductGroupView(ctx context.Context, req *GetProductGroupViewRequest) (*resources.ProductGroupView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetProductGroupView not implemented")
}

func RegisterProductGroupViewServiceServer(s *grpc.Server, srv ProductGroupViewServiceServer) {
	s.RegisterService(&_ProductGroupViewService_serviceDesc, srv)
}

func _ProductGroupViewService_GetProductGroupView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetProductGroupViewRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ProductGroupViewServiceServer).GetProductGroupView(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.ProductGroupViewService/GetProductGroupView",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ProductGroupViewServiceServer).GetProductGroupView(ctx, req.(*GetProductGroupViewRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ProductGroupViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.ProductGroupViewService",
	HandlerType: (*ProductGroupViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetProductGroupView",
			Handler:    _ProductGroupViewService_GetProductGroupView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/product_group_view_service.proto",
}
