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

package service

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.
	Debug
	Service
}

// 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 *callBeginCPUProfile:
			err := server.BeginCPUProfile(ctx);
			if err != nil {
				return nil, err
			}
			return &resultBeginCPUProfile{}, nil
		case *callEndCPUProfile:
			res, err := server.EndCPUProfile(ctx);
			if err != nil {
				return nil, err
			}
			return &resultEndCPUProfile{value: res}, nil
		case *callGetMemProfileRate:
			res, err := server.GetMemProfileRate(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetMemProfileRate{value: res}, nil
		case *callGetPerformanceCounters:
			res, err := server.GetPerformanceCounters(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetPerformanceCounters{value: res}, nil
		case *callGetProfile:
			res, err := server.GetProfile(ctx, call.name, call.debug);
			if err != nil {
				return nil, err
			}
			return &resultGetProfile{value: res}, nil
		case *callSetMemProfileRate:
			err := server.SetMemProfileRate(ctx, call.rate);
			if err != nil {
				return nil, err
			}
			return &resultSetMemProfileRate{}, nil
		case *callFollow:
			res, err := server.Follow(ctx, call.p);
			if err != nil {
				return nil, err
			}
			return &resultFollow{value: res}, nil
		case *callGet:
			res, err := server.Get(ctx, call.p);
			if err != nil {
				return nil, err
			}
			return &resultGet{value: res}, nil
		case *callGetAvailableStringTables:
			res, err := server.GetAvailableStringTables(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetAvailableStringTables{value: res}, nil
		case *callGetCaptures:
			res, err := server.GetCaptures(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetCaptures{value: res}, nil
		case *callGetDevices:
			res, err := server.GetDevices(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetDevices{value: res}, nil
		case *callGetFeatures:
			res, err := server.GetFeatures(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetFeatures{value: res}, nil
		case *callGetFramebufferAttachment:
			res, err := server.GetFramebufferAttachment(ctx, call.device, call.after, call.attachment, call.settings);
			if err != nil {
				return nil, err
			}
			return &resultGetFramebufferAttachment{value: res}, nil
		case *callGetFramebufferColor:
			res, err := server.GetFramebufferColor(ctx, call.device, call.after, call.settings);
			if err != nil {
				return nil, err
			}
			return &resultGetFramebufferColor{value: res}, nil
		case *callGetFramebufferDepth:
			res, err := server.GetFramebufferDepth(ctx, call.device, call.after);
			if err != nil {
				return nil, err
			}
			return &resultGetFramebufferDepth{value: res}, nil
		case *callGetSchema:
			res, err := server.GetSchema(ctx);
			if err != nil {
				return nil, err
			}
			return &resultGetSchema{value: res}, nil
		case *callGetStringTable:
			res, err := server.GetStringTable(ctx, call.info);
			if err != nil {
				return nil, err
			}
			return &resultGetStringTable{value: res}, nil
		case *callGetTimingInfo:
			res, err := server.GetTimingInfo(ctx, call.device, call.capture, call.flags);
			if err != nil {
				return nil, err
			}
			return &resultGetTimingInfo{value: res}, nil
		case *callImportCapture:
			res, err := server.ImportCapture(ctx, call.name, call.Data);
			if err != nil {
				return nil, err
			}
			return &resultImportCapture{value: res}, nil
		case *callLoadCapture:
			res, err := server.LoadCapture(ctx, call.path);
			if err != nil {
				return nil, err
			}
			return &resultLoadCapture{value: res}, nil
		case *callRegisterAndroidDevice:
			res, err := server.RegisterAndroidDevice(ctx, call.serial);
			if err != nil {
				return nil, err
			}
			return &resultRegisterAndroidDevice{value: res}, nil
		case *callSet:
			res, err := server.Set(ctx, call.p, call.v);
			if err != nil {
				return nil, err
			}
			return &resultSet{value: res}, nil
		default:
			return nil, &rpc.ErrUnknownFunction{Function: ty}
		}
	}
}
