// Code generated by ndpgen. DO NOT EDIT. package {{.Package}} import ( "context" "encoding/json" extism "github.com/extism/go-sdk" ) {{- /* Generate request/response types for all methods */ -}} {{range .Service.Methods}} {{- if .HasParams}} // {{requestType .}} is the request type for {{$.Service.Name}}.{{.Name}}. type {{requestType .}} struct { {{- range .Params}} {{title .Name}} {{.Type}} `json:"{{.JSONName}}"` {{- end}} } {{- end}} // {{responseType .}} is the response type for {{$.Service.Name}}.{{.Name}}. type {{responseType .}} struct { {{- range .Returns}} {{title .Name}} {{.Type}} `json:"{{.JSONName}},omitempty"` {{- end}} {{- if .HasError}} Error string `json:"error,omitempty"` {{- end}} } {{end}} // Register{{.Service.Name}}HostFunctions registers {{.Service.Name}} service host functions. // The returned host functions should be added to the plugin's configuration. func Register{{.Service.Name}}HostFunctions(service {{.Service.Interface}}) []extism.HostFunction { return []extism.HostFunction{ {{- range .Service.Methods}} new{{$.Service.Name}}{{.Name}}HostFunction(service), {{- end}} } } {{range .Service.Methods}} func new{{$.Service.Name}}{{.Name}}HostFunction(service {{$.Service.Interface}}) extism.HostFunction { return extism.NewHostFunctionWithStack( "{{exportName .}}", func(ctx context.Context, p *extism.CurrentPlugin, stack []uint64) { {{- if .HasParams}} // Read JSON request from plugin memory reqBytes, err := p.ReadBytes(stack[0]) if err != nil { {{$.Service.Name | lower}}WriteError(p, stack, err) return } var req {{requestType .}} if err := json.Unmarshal(reqBytes, &req); err != nil { {{$.Service.Name | lower}}WriteError(p, stack, err) return } {{- end}} // Call the service method {{- if .HasReturns}} {{- if .HasError}} {{range $i, $r := .Returns}}{{if $i}}, {{end}}{{lower $r.Name}}{{end}}, svcErr := service.{{.Name}}(ctx{{range .Params}}, req.{{title .Name}}{{end}}) if svcErr != nil { {{$.Service.Name | lower}}WriteError(p, stack, svcErr) return } {{- else}} {{range $i, $r := .Returns}}{{if $i}}, {{end}}{{lower $r.Name}}{{end}} := service.{{.Name}}(ctx{{range .Params}}, req.{{title .Name}}{{end}}) {{- end}} {{- else if .HasError}} if svcErr := service.{{.Name}}(ctx{{range .Params}}, req.{{title .Name}}{{end}}); svcErr != nil { {{$.Service.Name | lower}}WriteError(p, stack, svcErr) return } {{- else}} service.{{.Name}}(ctx{{range .Params}}, req.{{title .Name}}{{end}}) {{- end}} // Write JSON response to plugin memory resp := {{responseType .}}{ {{- range .Returns}} {{title .Name}}: {{lower .Name}}, {{- end}} } {{$.Service.Name | lower}}WriteResponse(p, stack, resp) }, []extism.ValueType{extism.ValueTypePTR}, []extism.ValueType{extism.ValueTypePTR}, ) } {{end}} // {{.Service.Name | lower}}WriteResponse writes a JSON response to plugin memory. func {{.Service.Name | lower}}WriteResponse(p *extism.CurrentPlugin, stack []uint64, resp any) { respBytes, err := json.Marshal(resp) if err != nil { {{.Service.Name | lower}}WriteError(p, stack, err) return } respPtr, err := p.WriteBytes(respBytes) if err != nil { stack[0] = 0 return } stack[0] = respPtr } // {{.Service.Name | lower}}WriteError writes an error response to plugin memory. func {{.Service.Name | lower}}WriteError(p *extism.CurrentPlugin, stack []uint64, err error) { errResp := struct { Error string `json:"error"` }{Error: err.Error()} respBytes, _ := json.Marshal(errResp) respPtr, _ := p.WriteBytes(respBytes) stack[0] = respPtr }