32 lines
788 B
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))
|
|
}
|
|
}
|