// Code generated by protoc-gen-go-micro. DO NOT EDIT.
// protoc-gen-go-micro version: v3.10.4
// source: test.proto

package helloworld

import (
	context "context"
	proto "go.unistack.org/micro-tests/server/grpc/proto"
	client "go.unistack.org/micro/v4/client"
	metadata "go.unistack.org/micro/v4/metadata"
	server "go.unistack.org/micro/v4/server"
)

type testClient struct {
	c    client.Client
	name string
}

func NewTestClient(name string, c client.Client) TestClient {
	return &testClient{c: c, name: name}
}

func (c *testClient) Call(ctx context.Context, req *proto.Request, opts ...client.CallOption) (*proto.Response, error) {
	rsp := &proto.Response{}
	err := c.c.Call(ctx, c.c.NewRequest(c.name, "Test.Call", req), rsp, opts...)
	if err != nil {
		return nil, err
	}
	return rsp, nil
}

func (c *testClient) StreamCall(ctx context.Context, opts ...client.CallOption) (Test_StreamCallClient, error) {
	stream, err := c.c.Stream(ctx, c.c.NewRequest(c.name, "Test.StreamCall", &proto.Request{}), opts...)
	if err != nil {
		return nil, err
	}
	return &testClientStreamCall{stream}, nil
}

type testClientStreamCall struct {
	stream client.Stream
}

func (s *testClientStreamCall) CloseAndRecv() (*proto.Response, error) {
	msg := &proto.Response{}
	err := s.RecvMsg(msg)
	if err == nil {
		err = s.Close()
	}
	if err != nil {
		return nil, err
	}
	return msg, nil
}

func (s *testClientStreamCall) Close() error {
	return s.stream.Close()
}

func (s *testClientStreamCall) CloseSend() error {
	return s.stream.CloseSend()
}

func (s *testClientStreamCall) Context() context.Context {
	return s.stream.Context()
}

func (s *testClientStreamCall) SendMsg(msg interface{}) error {
	return s.stream.Send(msg)
}

func (s *testClientStreamCall) RecvMsg(msg interface{}) error {
	return s.stream.Recv(msg)
}

func (s *testClientStreamCall) Header() metadata.Metadata {
	return s.stream.Response().Header()
}

func (s *testClientStreamCall) Send(msg *proto.Request) error {
	return s.stream.Send(msg)
}

func (s *testClientStreamCall) Recv() (*proto.Response, error) {
	msg := &proto.Response{}
	if err := s.stream.Recv(msg); err != nil {
		return nil, err
	}
	return msg, nil
}

type testServer struct {
	TestServer
}

func (h *testServer) Call(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
	return h.TestServer.Call(ctx, req, rsp)
}

func (h *testServer) StreamCall(ctx context.Context, stream server.Stream) error {
	return h.TestServer.StreamCall(ctx, &testStreamCallStream{stream})
}

type testStreamCallStream struct {
	stream server.Stream
}

func (s *testStreamCallStream) SendAndClose(msg *proto.Response) error {
	err := s.SendMsg(msg)
	if err == nil {
		err = s.stream.Close()
	}
	return err
}
func (s *testStreamCallStream) Close() error {
	return s.stream.Close()
}

func (s *testStreamCallStream) Context() context.Context {
	return s.stream.Context()
}

func (s *testStreamCallStream) SendMsg(msg interface{}) error {
	return s.stream.Send(msg)
}

func (s *testStreamCallStream) RecvMsg(msg interface{}) error {
	return s.stream.Recv(msg)
}

func (s *testStreamCallStream) Send(msg *proto.Response) error {
	return s.stream.Send(msg)
}

func (s *testStreamCallStream) Recv() (*proto.Request, error) {
	msg := &proto.Request{}
	if err := s.stream.Recv(msg); err != nil {
		return nil, err
	}
	return msg, nil
}

func RegisterTestServer(s server.Server, sh TestServer, opts ...server.HandlerOption) error {
	type test interface {
		Call(ctx context.Context, req *proto.Request, rsp *proto.Response) error
		StreamCall(ctx context.Context, stream server.Stream) error
	}
	type Test struct {
		test
	}
	h := &testServer{sh}
	return s.Handle(s.NewHandler(&Test{h}, opts...))
}
