wasi-module-sdk-go/entrypoint.go

149 lines
4.2 KiB
Go
Raw Normal View History

2023-05-08 13:21:31 +00:00
package sdk
import (
"context"
2023-09-05 20:06:42 +00:00
"errors"
2023-08-15 19:46:02 +00:00
"log/slog"
2023-09-05 20:06:42 +00:00
commonv1 "code.icb4dc0.de/buildr/api/generated/common/v1"
remotev1 "code.icb4dc0.de/buildr/api/generated/remote/v1"
wasiv1 "code.icb4dc0.de/buildr/api/generated/wasi/v1"
2023-08-23 16:44:02 +00:00
"code.icb4dc0.de/buildr/common/protocol"
2023-05-08 13:21:31 +00:00
)
2023-09-05 20:06:42 +00:00
var (
defaultRegistry = NewTypeRegistry()
startTaskWrapper = FuncExportWrapper[*remotev1.StartTaskRequest, *wasiv1.StartTaskResponse](StartTask)
inventoryWrapper = FuncExportWrapper[*wasiv1.PluginInventoryRequest, *wasiv1.PluginInventoryResponse](GetInventory)
helpForWrapper = FuncExportWrapper[*wasiv1.HelpRequest, *wasiv1.HelpResponse](HelpForModule)
binaryNameWrapper = FuncExportWrapper[*wasiv1.BinaryNameRequest, *wasiv1.BinaryNameResponse](BinaryNameForModule)
2023-09-05 20:06:42 +00:00
)
2023-05-08 13:21:31 +00:00
func Register(cat Category, moduleName string, factory Factory) {
defaultRegistry.Add(cat, moduleName, factory)
}
2023-09-05 20:06:42 +00:00
func GetInventory(*wasiv1.PluginInventoryRequest) (*wasiv1.PluginInventoryResponse, error) {
var inventory wasiv1.PluginInventoryResponse
2023-05-13 15:46:09 +00:00
for _, t := range defaultRegistry.List() {
2023-08-23 16:44:02 +00:00
m := defaultRegistry.Get(t.Category, t.Type)
spec, err := protocol.Marshal(m)
if err != nil {
panic(err)
}
data, err := spec.MarshalVT()
if err != nil {
panic(err)
}
2023-09-05 20:06:42 +00:00
inventory.Specs = append(inventory.Specs, &wasiv1.PluginInventoryResponse_InventorySpec{
ModuleRef: &commonv1.ModuleReference{
2023-08-23 16:44:02 +00:00
ModuleCategory: t.Category,
ModuleType: t.Type,
},
EmptySpec: data,
2023-05-13 15:46:09 +00:00
})
}
2023-09-05 20:06:42 +00:00
return &inventory, nil
2023-05-13 15:46:09 +00:00
}
2023-09-05 20:06:42 +00:00
func StartTask(req *remotev1.StartTaskRequest) (*wasiv1.StartTaskResponse, error) {
executor := NewExecutor(req.Buildr.Repo.Root, req.Buildr.OutDir, req.Buildr.BinDir)
reference := req.GetReference().GetModule()
2023-08-15 19:46:02 +00:00
module := defaultRegistry.Get(reference.GetModuleCategory(), reference.GetModuleType())
2023-05-08 13:21:31 +00:00
2023-09-05 20:06:42 +00:00
if err := protocol.Unmarshal(req.GetSpec(), module); err != nil {
2023-08-15 19:46:02 +00:00
executor.logger.Error("Failed to unmarshal spec", slog.String("error", err.Error()))
2023-09-05 20:06:42 +00:00
return nil, err
2023-05-08 13:21:31 +00:00
}
2023-09-05 20:06:42 +00:00
var startTaskResponse wasiv1.StartTaskResponse
2023-08-15 19:46:02 +00:00
2023-09-05 20:06:42 +00:00
if err := executor.Run(context.Background(), module); err != nil {
startTaskResponse.Error = err.Error()
2023-08-15 19:46:02 +00:00
}
2023-09-05 20:06:42 +00:00
return &startTaskResponse, nil
}
func HelpForModule(helpRequest *wasiv1.HelpRequest) (*wasiv1.HelpResponse, error) {
2023-08-15 19:46:02 +00:00
module := defaultRegistry.Get(helpRequest.ModuleReference.ModuleCategory, helpRequest.ModuleReference.ModuleType)
if module == nil {
2023-09-05 20:06:42 +00:00
return nil, errors.New("unknown module")
2023-08-15 19:46:02 +00:00
}
helper, ok := module.(Helper)
if !ok {
2023-09-05 20:06:42 +00:00
return new(wasiv1.HelpResponse), nil
2023-08-15 19:46:02 +00:00
}
modHelp := helper.Help()
2023-09-05 20:06:42 +00:00
helpResponse := &wasiv1.HelpResponse{
2023-08-15 19:46:02 +00:00
Name: modHelp.Name,
Description: modHelp.Description,
2023-09-05 20:06:42 +00:00
Examples: make([]*wasiv1.TaskExample, 0, len(modHelp.Examples)),
2023-08-15 19:46:02 +00:00
}
for _, e := range modHelp.Examples {
modSpec, err := protocol.Marshal(e.Spec.Module)
if err != nil {
panic(err)
}
2023-09-05 20:06:42 +00:00
helpResponse.Examples = append(helpResponse.Examples, &wasiv1.TaskExample{
2023-08-15 19:46:02 +00:00
Name: e.Name,
Description: e.Description,
2023-09-05 20:06:42 +00:00
TaskSpec: &commonv1.TaskSpec{
2023-08-15 19:46:02 +00:00
ModuleName: e.Spec.ModuleName,
Container: e.Spec.Container,
OutputDir: e.Spec.OutputDir,
ModuleSpec: modSpec,
},
})
}
2023-09-05 20:06:42 +00:00
return helpResponse, nil
}
func BinaryNameForModule(req *wasiv1.BinaryNameRequest) (*wasiv1.BinaryNameResponse, error) {
module := defaultRegistry.Get(req.ModuleReference.ModuleCategory, req.ModuleReference.ModuleType)
if module == nil {
return nil, errors.New("unknown module")
}
namer, ok := module.(BinaryNamer)
if !ok {
return new(wasiv1.BinaryNameResponse), nil
}
if err := protocol.Unmarshal(req.GetSpec(), module); err != nil {
return nil, err
}
return &wasiv1.BinaryNameResponse{
Name: namer.BinaryName(),
}, nil
}
2023-09-05 20:06:42 +00:00
//export /buildr.rpc.v1.WasiExecutorService/PluginInventory
func Inventory(ptr, size uint32) uint64 {
return inventoryWrapper.Call(ptr, size)
}
//export /buildr.rpc.v1.WasiExecutorService/StartTask
func Run(ptr, size uint32) uint64 {
return startTaskWrapper.Call(ptr, size)
}
2023-08-15 19:46:02 +00:00
2023-09-05 20:06:42 +00:00
//export /buildr.rpc.v1.WasiExecutorService/Help
func HelpFor(ptr, size uint32) uint64 {
return helpForWrapper.Call(ptr, size)
2023-08-15 19:46:02 +00:00
}
//export /buildr.rpc.v1.WasiExecutorService/BinaryName
func BinaryNameFor(ptr, size uint32) uint64 {
return binaryNameWrapper.Call(ptr, size)
}