////////////////////////////////////////////////////////////////////////////////
// Do not modify!
// Generated by rpcapi
////////////////////////////////////////////////////////////////////////////////

package service

import (
	"fmt"
	"io"
	"runtime/debug"

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

func BindServer(r io.Reader, w io.Writer, mtu int, l log.Logger, server RPC) {
	rpc.Serve(l, r, w, mtu, func(in interface{}) (res binary.Object) {
		l := l.Fork().Enter(fmt.Sprintf("%v", in))
		defer func() {
			if err := recover(); err == nil {
				l.Infof("↪ %v", res)
			} else {
				msg := fmt.Sprintf("Panic: %v\n%v", err, string(debug.Stack()))
				l.Errorf(msg)
				res = rpc.NewError(msg)
			}
		}()
		switch call := in.(type) {
		case *callImport:
			if res, err := server.Import(l, call.name, call.Data); err == nil {
				return &resultImport{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetCaptures:
			if res, err := server.GetCaptures(l); err == nil {
				return &resultGetCaptures{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetDevices:
			if res, err := server.GetDevices(l); err == nil {
				return &resultGetDevices{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetState:
			if res, err := server.GetState(l, call.capture, call.after); err == nil {
				return &resultGetState{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetHierarchy:
			if res, err := server.GetHierarchy(l, call.capture); err == nil {
				return &resultGetHierarchy{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetMemoryInfo:
			if res, err := server.GetMemoryInfo(l, call.capture, call.after, call.rng); err == nil {
				return &resultGetMemoryInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetFramebufferColor:
			if res, err := server.GetFramebufferColor(l, call.device, call.capture, call.api, call.after, call.settings); err == nil {
				return &resultGetFramebufferColor{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetFramebufferDepth:
			if res, err := server.GetFramebufferDepth(l, call.device, call.capture, call.api, call.after); err == nil {
				return &resultGetFramebufferDepth{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callGetTimingInfo:
			if res, err := server.GetTimingInfo(l, call.device, call.capture, call.mask); err == nil {
				return &resultGetTimingInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callPrerenderFramebuffers:
			if res, err := server.PrerenderFramebuffers(l, call.device, call.capture, call.api, call.width, call.height, call.atomIds); err == nil {
				return &resultPrerenderFramebuffers{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callReplaceAtom:
			if res, err := server.ReplaceAtom(l, call.capture, call.atomId, call.atomType, call.data); err == nil {
				return &resultReplaceAtom{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveAtomStream:
			if res, err := server.ResolveAtomStream(l, call.id); err == nil {
				return &resultResolveAtomStream{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveBinary:
			if res, err := server.ResolveBinary(l, call.id); err == nil {
				return &resultResolveBinary{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveCapture:
			if res, err := server.ResolveCapture(l, call.id); err == nil {
				return &resultResolveCapture{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveDevice:
			if res, err := server.ResolveDevice(l, call.id); err == nil {
				return &resultResolveDevice{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveHierarchy:
			if res, err := server.ResolveHierarchy(l, call.id); err == nil {
				return &resultResolveHierarchy{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveImageInfo:
			if res, err := server.ResolveImageInfo(l, call.id); err == nil {
				return &resultResolveImageInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveMemoryInfo:
			if res, err := server.ResolveMemoryInfo(l, call.id); err == nil {
				return &resultResolveMemoryInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveSchema:
			if res, err := server.ResolveSchema(l, call.id); err == nil {
				return &resultResolveSchema{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		case *callResolveTimingInfo:
			if res, err := server.ResolveTimingInfo(l, call.id); err == nil {
				return &resultResolveTimingInfo{value: res}
			} else {
				return rpc.NewError(err.Error())
			}
		default:
			return rpc.NewError("Unexpected RPC function: %T", call)
		}
	})
}
