////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by codergen
////////////////////////////////////////////////////////////////////////////////

package test

import (
	"fmt"
	"io"

	"android.googlesource.com/platform/tools/gpu/framework/binary"
	"android.googlesource.com/platform/tools/gpu/framework/log"
	"android.googlesource.com/platform/tools/gpu/framework/rpc"
)

// Server is the server interface for service calls.
type Server interface {
	// Server exposes all the service interface methods.
	RPC
}

// BindServer starts a service on the stream s, delegating all RPC calls on to server.
func BindServer(ctx log.Context, s io.ReadWriteCloser, mtu int, server Server) {
	rpc.Serve(ctx, s, mtu, Handler(server))
}

// Handler returns an rpc.Handler wrapping the given server.
func Handler(server Server) rpc.Handler {
	return func(ctx log.Context, in interface{}) (res binary.Object, err error) {
		ty := fmt.Sprintf("%T", in)
		ctx = ctx.Enter(ty)
		defer func() {
			if r := recover(); r == nil {
				if err != nil {
					ctx.Tag("rpc").LogError(err)
				}
			} else {
				var ok bool
				if err, ok = r.(error); !ok {
					err = fmt.Errorf("%v", r)
				}
				ctx.Fail(err, "")
				err = &rpc.ErrPanic{Msg: err.Error()}
			}
		}()
		switch call := in.(type) {
		case *callAdd:
			res, err := server.Add(ctx, call.a, call.b);
			if err != nil {
				return nil, err
			}
			return &resultAdd{value: res}, nil
		case *callEnumToString:
			res, err := server.EnumToString(ctx, call.e);
			if err != nil {
				return nil, err
			}
			return &resultEnumToString{value: res}, nil
		case *callGetListNodeChain:
			res, err := server.GetListNodeChain(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetListNodeChain{value: res}, nil
		case *callGetListNodeChainArray:
			res, err := server.GetListNodeChainArray(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetListNodeChainArray{value: res}, nil
		case *callGetResource:
			res, err := server.GetResource(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetResource{value: res}, nil
		case *callGetSingleListNode:
			res, err := server.GetSingleListNode(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetSingleListNode{value: res}, nil
		case *callGetStruct:
			res, err := server.GetStruct(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetStruct{value: res}, nil
		case *callResolveResource:
			res, err := server.ResolveResource(ctx, call.r);
			if err != nil {
				return nil, err
			}
			return &resultResolveResource{value: res}, nil
		case *callSetStruct:
			err := server.SetStruct(ctx, call.s);
			if err != nil {
				return nil, err
			}
			return &resultSetStruct{}, nil
		case *callUseResource:
			err := server.UseResource(ctx, call.r);
			if err != nil {
				return nil, err
			}
			return &resultUseResource{}, nil
		default:
			return nil, &rpc.ErrUnknownFunction{Function: ty}
		}
	}
}
