wasi-module-sdk-go/export.go

32 lines
788 B
Go

package sdk
import (
"reflect"
bapi "code.icb4dc0.de/buildr/api"
"code.icb4dc0.de/buildr/wasi-module-sdk-go/mem"
)
type FuncExportWrapper[TRequest bapi.ProtoMessage, TResponse bapi.ProtoMessage] func(req TRequest) (TResponse, error)
func (w FuncExportWrapper[TRequest, TResponse]) Call(reqPtr, reqSize uint32) uint64 {
var req TRequest
if reflect.TypeOf(req).Kind() == reflect.Ptr {
req = reflect.New(reflect.TypeOf(req).Elem()).Interface().(TRequest)
}
if err := req.UnmarshalVT(mem.DataFromPtr(reqPtr, reqSize)); err != nil {
panic(err)
}
if resp, err := w(req); err != nil {
panic(err)
} else if data, err := resp.MarshalVT(); err != nil {
panic(err)
} else if len(data) == 0 {
return 0
} else {
return mem.UnifyPtrSize(mem.DataToUnmanagedPtr(data))
}
}