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

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

var xxx_messageInfo_GetAdGroupAudienceViewRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_88c843f8d448d38a = []byte{
	// 423 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xb1, 0x8a, 0xd5, 0x40,
	0x14, 0x25, 0x59, 0x10, 0x0c, 0xda, 0xa4, 0xd0, 0x25, 0x2a, 0xfb, 0x58, 0xb6, 0x58, 0xb6, 0x98,
	0x01, 0x03, 0x8b, 0x8c, 0xa8, 0xcc, 0x03, 0x89, 0x36, 0xcb, 0xb2, 0x42, 0x0a, 0x09, 0x84, 0xd9,
	0xcc, 0x35, 0x0e, 0x24, 0x33, 0x71, 0x26, 0xc9, 0x16, 0x62, 0x63, 0xe1, 0x0f, 0x58, 0xdb, 0x58,
	0xfa, 0x29, 0xdb, 0xda, 0x59, 0x29, 0x58, 0xf9, 0x15, 0x92, 0x9d, 0x4c, 0xf6, 0x3d, 0x7c, 0xf1,
	0x75, 0x87, 0x9c, 0x73, 0xcf, 0xb9, 0x73, 0x6e, 0x82, 0xe7, 0xa5, 0x52, 0x65, 0x05, 0x98, 0x71,
	0x83, 0x2d, 0x1c, 0x50, 0x1f, 0x63, 0x03, 0xba, 0x17, 0x05, 0x18, 0xcc, 0x78, 0x5e, 0x6a, 0xd5,
	0x35, 0x39, 0xeb, 0xb8, 0x00, 0x59, 0x40, 0xde, 0x0b, 0xb8, 0xc8, 0x47, 0x1e, 0x35, 0x5a, 0xb5,
	0x2a, 0x5c, 0xd8, 0x59, 0xc4, 0xb8, 0x41, 0x93, 0x0d, 0xea, 0x63, 0xe4, 0x6c, 0xa2, 0xa7, 0x73,
	0x41, 0x1a, 0x8c, 0xea, 0xf4, 0x7c, 0x92, 0x4d, 0x88, 0xee, 0xbb, 0xf9, 0x46, 0x60, 0x26, 0xa5,
	0x6a, 0x59, 0x2b, 0x94, 0x34, 0x23, 0x7b, 0x77, 0x85, 0x2d, 0x2a, 0x01, 0xb2, 0x1d, 0x89, 0xbd,
	0x15, 0xe2, 0x8d, 0x80, 0x8a, 0xe7, 0xe7, 0xf0, 0x96, 0xf5, 0x42, 0x69, 0x2b, 0xd8, 0x7f, 0x19,
	0x3c, 0x48, 0xa0, 0xa5, 0x3c, 0x19, 0x92, 0xe9, 0x18, 0x9c, 0x0a, 0xb8, 0x38, 0x83, 0x77, 0x1d,
	0x98, 0x36, 0x3c, 0x0c, 0x6e, 0xbb, 0x15, 0x73, 0xc9, 0x6a, 0xd8, 0xf5, 0x16, 0xde, 0xe1, 0xcd,
	0xe5, 0xce, 0x4f, 0xea, 0x9f, 0xdd, 0x72, 0xcc, 0x09, 0xab, 0xe1, 0xe1, 0x17, 0x3f, 0x88, 0x36,
	0x18, 0xbd, 0xb2, 0x15, 0x84, 0xbf, 0xbc, 0xe0, 0xce, 0xe6, 0xa8, 0xf0, 0x19, 0xda, 0xd6, 0x1f,
	0xfa, 0xef, 0x92, 0xd1, 0xf1, 0xac, 0xc1, 0x54, 0x2f, 0xda, 0x30, 0xbe, 0x7f, 0xf2, 0x83, 0xae,
	0xbf, 0xee, 0xe3, 0xf7, 0xdf, 0x9f, 0xfd, 0x47, 0xe1, 0xf1, 0x70, 0x99, 0xf7, 0x6b, 0xcc, 0x93,
	0xa2, 0x33, 0xad, 0xaa, 0x41, 0x1b, 0x7c, 0x84, 0xd9, 0xbf, 0x5e, 0x06, 0x1f, 0x7d, 0x88, 0xee,
	0x5d, 0xd2, 0xdd, 0xeb, 0xf8, 0x11, 0x35, 0xc2, 0xa0, 0x42, 0xd5, 0xcb, 0x4f, 0x7e, 0x70, 0x50,
	0xa8, 0x7a, 0xeb, 0x5b, 0x97, 0x7b, 0xf3, 0x2d, 0x9e, 0x0e, 0x47, 0x3b, 0xf5, 0x5e, 0xbf, 0x18,
	0x4d, 0x4a, 0x55, 0x31, 0x59, 0x22, 0xa5, 0x4b, 0x5c, 0x82, 0xbc, 0x3a, 0x29, 0xbe, 0x8e, 0x9d,
	0xff, 0xad, 0x1f, 0x3b, 0xf0, 0xd5, 0xdf, 0x49, 0x28, 0xfd, 0xe6, 0x2f, 0x12, 0x6b, 0x48, 0xb9,
	0x41, 0x16, 0x0e, 0x28, 0x8d, 0xd1, 0x18, 0x6c, 0x2e, 0x9d, 0x24, 0xa3, 0xdc, 0x64, 0x93, 0x24,
	0x4b, 0xe3, 0xcc, 0x49, 0xfe, 0xf8, 0x07, 0xf6, 0x3b, 0x21, 0x94, 0x1b, 0x42, 0x26, 0x11, 0x21,
	0x69, 0x4c, 0x88, 0x93, 0x9d, 0xdf, 0xb8, 0xda, 0x33, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc0,
	0x2d, 0x4d, 0x1d, 0x7d, 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

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

type adGroupAudienceViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewAdGroupAudienceViewServiceClient(cc grpc.ClientConnInterface) AdGroupAudienceViewServiceClient {
	return &adGroupAudienceViewServiceClient{cc}
}

func (c *adGroupAudienceViewServiceClient) GetAdGroupAudienceView(ctx context.Context, in *GetAdGroupAudienceViewRequest, opts ...grpc.CallOption) (*resources.AdGroupAudienceView, error) {
	out := new(resources.AdGroupAudienceView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.AdGroupAudienceViewService/GetAdGroupAudienceView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// AdGroupAudienceViewServiceServer is the server API for AdGroupAudienceViewService service.
type AdGroupAudienceViewServiceServer interface {
	// Returns the requested ad group audience view in full detail.
	GetAdGroupAudienceView(context.Context, *GetAdGroupAudienceViewRequest) (*resources.AdGroupAudienceView, error)
}

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

func (*UnimplementedAdGroupAudienceViewServiceServer) GetAdGroupAudienceView(ctx context.Context, req *GetAdGroupAudienceViewRequest) (*resources.AdGroupAudienceView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetAdGroupAudienceView not implemented")
}

func RegisterAdGroupAudienceViewServiceServer(s *grpc.Server, srv AdGroupAudienceViewServiceServer) {
	s.RegisterService(&_AdGroupAudienceViewService_serviceDesc, srv)
}

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

var _AdGroupAudienceViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.AdGroupAudienceViewService",
	HandlerType: (*AdGroupAudienceViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetAdGroupAudienceView",
			Handler:    _AdGroupAudienceViewService_GetAdGroupAudienceView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/ad_group_audience_view_service.proto",
}
