// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc             v3.12.4
// source: proto/src.proto

package proto

import (
	context "context"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
)

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7

// TestImportClient is the client API for TestImport service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type TestImportClient interface {
	Run(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error)
}

type testImportClient struct {
	cc grpc.ClientConnInterface
}

func NewTestImportClient(cc grpc.ClientConnInterface) TestImportClient {
	return &testImportClient{cc}
}

func (c *testImportClient) Run(ctx context.Context, in *Request, opts ...grpc.CallOption) (*Response, error) {
	out := new(Response)
	err := c.cc.Invoke(ctx, "/helloworld.TestImport/Run", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// TestImportServer is the server API for TestImport service.
// All implementations must embed UnimplementedTestImportServer
// for forward compatibility
type TestImportServer interface {
	Run(context.Context, *Request) (*Response, error)
	mustEmbedUnimplementedTestImportServer()
}

// UnimplementedTestImportServer must be embedded to have forward compatible implementations.
type UnimplementedTestImportServer struct {
}

func (UnimplementedTestImportServer) Run(context.Context, *Request) (*Response, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Run not implemented")
}
func (UnimplementedTestImportServer) mustEmbedUnimplementedTestImportServer() {}

// UnsafeTestImportServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to TestImportServer will
// result in compilation errors.
type UnsafeTestImportServer interface {
	mustEmbedUnimplementedTestImportServer()
}

func RegisterTestImportServer(s grpc.ServiceRegistrar, srv TestImportServer) {
	s.RegisterService(&TestImport_ServiceDesc, srv)
}

func _TestImport_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Request)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestImportServer).Run(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/helloworld.TestImport/Run",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestImportServer).Run(ctx, req.(*Request))
	}
	return interceptor(ctx, in, info, handler)
}

// TestImport_ServiceDesc is the grpc.ServiceDesc for TestImport service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var TestImport_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "helloworld.TestImport",
	HandlerType: (*TestImportServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Run",
			Handler:    _TestImport_Run_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "proto/src.proto",
}
