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

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

var xxx_messageInfo_GetGenderViewRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_75bfb9a4f4d1dcee = []byte{
	// 409 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x3f, 0xeb, 0xd3, 0x40,
	0x18, 0x26, 0xf9, 0x81, 0x60, 0xb0, 0x83, 0x41, 0xb4, 0x44, 0xc1, 0x52, 0x3a, 0x94, 0x42, 0xef,
	0xc0, 0x80, 0xc3, 0x89, 0xe0, 0x15, 0x24, 0x4e, 0x52, 0x2a, 0x64, 0x90, 0x40, 0xb8, 0x26, 0xaf,
	0xf1, 0x20, 0xc9, 0xd5, 0xbb, 0x34, 0x1d, 0xc4, 0xc5, 0xaf, 0xe0, 0x37, 0x70, 0xf4, 0x3b, 0xf8,
	0x05, 0xba, 0xba, 0x39, 0x39, 0x38, 0x39, 0xf9, 0x05, 0x04, 0x49, 0x2f, 0x97, 0xb4, 0xfa, 0x2b,
	0xdd, 0x1e, 0xee, 0xf9, 0xf3, 0xbe, 0xef, 0x93, 0x38, 0x24, 0x13, 0x22, 0xcb, 0x01, 0xb3, 0x54,
	0x61, 0x0d, 0x1b, 0x54, 0xfb, 0x58, 0x81, 0xac, 0x79, 0x02, 0x0a, 0x67, 0x50, 0xa6, 0x20, 0xe3,
	0x9a, 0xc3, 0x2e, 0x6e, 0x1f, 0xd1, 0x46, 0x8a, 0x4a, 0xb8, 0x23, 0x6d, 0x40, 0x2c, 0x55, 0xa8,
	0xf3, 0xa2, 0xda, 0x47, 0xc6, 0xeb, 0xf9, 0xe7, 0xd2, 0x25, 0x28, 0xb1, 0x95, 0xff, 0xc4, 0xeb,
	0x58, 0xef, 0x81, 0x31, 0x6d, 0x38, 0x66, 0x65, 0x29, 0x2a, 0x56, 0x71, 0x51, 0xaa, 0x96, 0xbd,
	0x77, 0xc4, 0x26, 0x39, 0x87, 0xb2, 0x6a, 0x89, 0x87, 0x47, 0xc4, 0x1b, 0x0e, 0x79, 0x1a, 0xaf,
	0xe1, 0x2d, 0xab, 0xb9, 0x90, 0x5a, 0x30, 0x7e, 0xe6, 0xdc, 0x09, 0xa0, 0x0a, 0x0e, 0xf3, 0x42,
	0x0e, 0xbb, 0x15, 0xbc, 0xdb, 0x82, 0xaa, 0xdc, 0xa9, 0x33, 0x30, 0xeb, 0xc4, 0x25, 0x2b, 0x60,
	0x68, 0x8d, 0xac, 0xe9, 0xcd, 0xc5, 0xd5, 0x0f, 0x6a, 0xaf, 0x6e, 0x19, 0xe6, 0x25, 0x2b, 0xe0,
	0xd1, 0x6f, 0xcb, 0xb9, 0xdd, 0xfb, 0x5f, 0xe9, 0x2b, 0xdd, 0xaf, 0x96, 0x33, 0x38, 0x09, 0x76,
	0x1f, 0xa3, 0x4b, 0xcd, 0xa0, 0xeb, 0x36, 0xf1, 0xe6, 0x67, 0x7d, 0x5d, 0x5f, 0xa8, 0x77, 0x8d,
	0x9f, 0x7f, 0xa7, 0xa7, 0x9b, 0x7f, 0xfc, 0xf6, 0xf3, 0x93, 0x8d, 0xdd, 0x79, 0xd3, 0xf0, 0xfb,
	0x13, 0xe6, 0x69, 0xb2, 0x55, 0x95, 0x28, 0x40, 0x2a, 0x3c, 0x6b, 0x2b, 0x6f, 0x22, 0x14, 0x9e,
	0x7d, 0xf0, 0xee, 0xef, 0xe9, 0xb0, 0x1f, 0xd6, 0xa2, 0x0d, 0x57, 0x28, 0x11, 0xc5, 0xe2, 0x8f,
	0xe5, 0x4c, 0x12, 0x51, 0x5c, 0x3c, 0x68, 0x71, 0xf7, 0xbf, 0x62, 0x96, 0x4d, 0xeb, 0x4b, 0xeb,
	0xf5, 0x8b, 0xd6, 0x9b, 0x89, 0x9c, 0x95, 0x19, 0x12, 0x32, 0x6b, 0x36, 0x38, 0x7c, 0x13, 0xdc,
	0x4f, 0x3b, 0xff, 0x07, 0x3e, 0x31, 0xe0, 0xb3, 0x7d, 0x15, 0x50, 0xfa, 0xc5, 0x1e, 0x05, 0x3a,
	0x90, 0xa6, 0x0a, 0x69, 0xd8, 0xa0, 0xd0, 0x47, 0xed, 0x60, 0xb5, 0x37, 0x92, 0x88, 0xa6, 0x2a,
	0xea, 0x24, 0x51, 0xe8, 0x47, 0x46, 0xf2, 0xcb, 0x9e, 0xe8, 0x77, 0x42, 0x68, 0xaa, 0x08, 0xe9,
	0x44, 0x84, 0x84, 0x3e, 0x21, 0x46, 0xb6, 0xbe, 0x71, 0xd8, 0xd3, 0xff, 0x1b, 0x00, 0x00, 0xff,
	0xff, 0xfd, 0xf5, 0x10, 0xad, 0x28, 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

// GenderViewServiceClient is the client API for GenderViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type GenderViewServiceClient interface {
	// Returns the requested gender view in full detail.
	GetGenderView(ctx context.Context, in *GetGenderViewRequest, opts ...grpc.CallOption) (*resources.GenderView, error)
}

type genderViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewGenderViewServiceClient(cc grpc.ClientConnInterface) GenderViewServiceClient {
	return &genderViewServiceClient{cc}
}

func (c *genderViewServiceClient) GetGenderView(ctx context.Context, in *GetGenderViewRequest, opts ...grpc.CallOption) (*resources.GenderView, error) {
	out := new(resources.GenderView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.GenderViewService/GetGenderView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// GenderViewServiceServer is the server API for GenderViewService service.
type GenderViewServiceServer interface {
	// Returns the requested gender view in full detail.
	GetGenderView(context.Context, *GetGenderViewRequest) (*resources.GenderView, error)
}

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

func (*UnimplementedGenderViewServiceServer) GetGenderView(ctx context.Context, req *GetGenderViewRequest) (*resources.GenderView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetGenderView not implemented")
}

func RegisterGenderViewServiceServer(s *grpc.Server, srv GenderViewServiceServer) {
	s.RegisterService(&_GenderViewService_serviceDesc, srv)
}

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

var _GenderViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.GenderViewService",
	HandlerType: (*GenderViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetGenderView",
			Handler:    _GenderViewService_GetGenderView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/gender_view_service.proto",
}
