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

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

var xxx_messageInfo_GetDisplayKeywordViewRequest proto.InternalMessageInfo

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

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

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

var fileDescriptor_157dba0f7495fb59 = []byte{
	// 425 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4d, 0x6b, 0xd5, 0x40,
	0x14, 0xe5, 0xa5, 0x20, 0x18, 0x74, 0x13, 0x10, 0x6b, 0x2c, 0xfa, 0x28, 0x5d, 0x94, 0x2e, 0x66,
	0xc0, 0x50, 0x84, 0xf1, 0x03, 0xe6, 0x29, 0xbc, 0x82, 0x28, 0xa5, 0x42, 0x16, 0x12, 0x08, 0xd3,
	0xcc, 0x35, 0x0e, 0x26, 0x99, 0x38, 0x37, 0x2f, 0x8f, 0x22, 0x6e, 0x04, 0x7f, 0x81, 0x1b, 0xd7,
	0x2e, 0xfd, 0x29, 0xdd, 0xba, 0x13, 0x04, 0x17, 0xae, 0xfc, 0x15, 0x92, 0x4e, 0x26, 0x7d, 0xa5,
	0xc6, 0xb7, 0x3b, 0xcc, 0x39, 0xf7, 0x9c, 0xfb, 0x31, 0xfe, 0x93, 0x5c, 0xeb, 0xbc, 0x00, 0x2a,
	0x24, 0x52, 0x0b, 0x3b, 0xd4, 0x46, 0x14, 0xc1, 0xb4, 0x2a, 0x03, 0xa4, 0x52, 0x61, 0x5d, 0x88,
	0x93, 0xf4, 0x2d, 0x9c, 0x2c, 0xb5, 0x91, 0x69, 0xab, 0x60, 0x99, 0xf6, 0x2c, 0xa9, 0x8d, 0x6e,
	0x74, 0x30, 0xb5, 0x95, 0x44, 0x48, 0x24, 0x83, 0x09, 0x69, 0x23, 0xe2, 0x4c, 0xc2, 0x87, 0x63,
	0x31, 0x06, 0x50, 0x2f, 0xcc, 0x58, 0x8e, 0xf5, 0x0f, 0xb7, 0x5c, 0x75, 0xad, 0xa8, 0xa8, 0x2a,
	0xdd, 0x88, 0x46, 0xe9, 0x0a, 0x7b, 0xf6, 0xe6, 0x0a, 0x9b, 0x15, 0x0a, 0xaa, 0xa6, 0x27, 0xee,
	0xae, 0x10, 0xaf, 0x15, 0x14, 0x32, 0x3d, 0x86, 0x37, 0xa2, 0x55, 0xda, 0x58, 0xc1, 0xf6, 0x81,
	0xbf, 0x35, 0x87, 0xe6, 0xa9, 0x0d, 0x7e, 0x66, 0x73, 0x63, 0x05, 0xcb, 0x23, 0x78, 0xb7, 0x00,
	0x6c, 0x82, 0x5d, 0xff, 0xba, 0xeb, 0x2f, 0xad, 0x44, 0x09, 0x9b, 0x93, 0xe9, 0x64, 0xf7, 0xea,
	0x6c, 0xe3, 0x17, 0xf7, 0x8e, 0xae, 0x39, 0xe6, 0x85, 0x28, 0xe1, 0xde, 0x17, 0xcf, 0xbf, 0x75,
	0xd9, 0xe7, 0xa5, 0x1d, 0x3f, 0xf8, 0x39, 0xf1, 0x6f, 0xfc, 0x33, 0x28, 0x78, 0x4c, 0xd6, 0xad,
	0x8e, 0xfc, 0xaf, 0xc3, 0x70, 0x7f, 0xb4, 0x7e, 0x58, 0x2c, 0xb9, 0x5c, 0xbd, 0xfd, 0xfc, 0x07,
	0xbf, 0x38, 0xd9, 0xc7, 0xef, 0xbf, 0x3f, 0x7b, 0xf7, 0x83, 0xfd, 0xee, 0x24, 0xef, 0x2f, 0x30,
	0x8f, 0xb2, 0x05, 0x36, 0xba, 0x04, 0x83, 0x74, 0xcf, 0xdd, 0x68, 0xc5, 0x0a, 0xe9, 0xde, 0x87,
	0xf0, 0xf6, 0x29, 0xdf, 0x3c, 0x0f, 0xef, 0x51, 0xad, 0x90, 0x64, 0xba, 0x9c, 0x7d, 0xf2, 0xfc,
	0x9d, 0x4c, 0x97, 0x6b, 0x07, 0x9d, 0xdd, 0x19, 0x5d, 0xe0, 0x61, 0x77, 0xad, 0xc3, 0xc9, 0xab,
	0x83, 0xde, 0x23, 0xd7, 0x85, 0xa8, 0x72, 0xa2, 0x4d, 0x4e, 0x73, 0xa8, 0xce, 0x6e, 0x49, 0xcf,
	0x53, 0xc7, 0xff, 0xf2, 0x03, 0x07, 0xbe, 0x7a, 0x1b, 0x73, 0xce, 0xbf, 0x79, 0xd3, 0xb9, 0x35,
	0xe4, 0x12, 0x89, 0x85, 0x1d, 0x8a, 0x23, 0xd2, 0x07, 0xe3, 0xa9, 0x93, 0x24, 0x5c, 0x62, 0x32,
	0x48, 0x92, 0x38, 0x4a, 0x9c, 0xe4, 0x8f, 0xb7, 0x63, 0xdf, 0x19, 0xe3, 0x12, 0x19, 0x1b, 0x44,
	0x8c, 0xc5, 0x11, 0x63, 0x4e, 0x76, 0x7c, 0xe5, 0xac, 0xcf, 0xe8, 0x6f, 0x00, 0x00, 0x00, 0xff,
	0xff, 0xc6, 0xd3, 0x99, 0xcb, 0x72, 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

// DisplayKeywordViewServiceClient is the client API for DisplayKeywordViewService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type DisplayKeywordViewServiceClient interface {
	// Returns the requested display keyword view in full detail.
	GetDisplayKeywordView(ctx context.Context, in *GetDisplayKeywordViewRequest, opts ...grpc.CallOption) (*resources.DisplayKeywordView, error)
}

type displayKeywordViewServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewDisplayKeywordViewServiceClient(cc grpc.ClientConnInterface) DisplayKeywordViewServiceClient {
	return &displayKeywordViewServiceClient{cc}
}

func (c *displayKeywordViewServiceClient) GetDisplayKeywordView(ctx context.Context, in *GetDisplayKeywordViewRequest, opts ...grpc.CallOption) (*resources.DisplayKeywordView, error) {
	out := new(resources.DisplayKeywordView)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.DisplayKeywordViewService/GetDisplayKeywordView", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// DisplayKeywordViewServiceServer is the server API for DisplayKeywordViewService service.
type DisplayKeywordViewServiceServer interface {
	// Returns the requested display keyword view in full detail.
	GetDisplayKeywordView(context.Context, *GetDisplayKeywordViewRequest) (*resources.DisplayKeywordView, error)
}

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

func (*UnimplementedDisplayKeywordViewServiceServer) GetDisplayKeywordView(ctx context.Context, req *GetDisplayKeywordViewRequest) (*resources.DisplayKeywordView, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetDisplayKeywordView not implemented")
}

func RegisterDisplayKeywordViewServiceServer(s *grpc.Server, srv DisplayKeywordViewServiceServer) {
	s.RegisterService(&_DisplayKeywordViewService_serviceDesc, srv)
}

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

var _DisplayKeywordViewService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.DisplayKeywordViewService",
	HandlerType: (*DisplayKeywordViewServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetDisplayKeywordView",
			Handler:    _DisplayKeywordViewService_GetDisplayKeywordView_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/display_keyword_view_service.proto",
}
