diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0841a67 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +examples/sdk/pkg/bindings/imports/** linguist-generated=true +examples/sdk/pkg/bindings/exports/wit_exports/** linguist-generated=true +examples/sdk/pkg/wit/deps/** linguist-generated=true \ No newline at end of file diff --git a/examples/sdk/README.md b/examples/sdk/README.md new file mode 100644 index 0000000..c1ea56b --- /dev/null +++ b/examples/sdk/README.md @@ -0,0 +1,44 @@ +# Building SDKs for componentize-go applications + +While feasible, it can be tedious to work directly with WIT types in Go. In most cases, it's better to have an SDK layer that handles the conversions from WIT types to idiomatic Go types. This example demonstrates the ways that we handle WIT `imports` and `exports` in order to have shared code feel natural for Go developers to use. + +The [application](component/main.go) that's being demonstrated imports the TCP portion of `wasi:sockets` and defines a Run export for `wasi:cli`, both of which have been wrapped in an SDK (see the `pkg` directory). + +## componentize-go.toml + +```toml +# componentize-go.toml file structure + +# The FULL names of the default WIT worlds +worlds = ["example:sdk/test", "foo:bar/baz"] +# The paths in which the WIT files are stored. +wit_paths = ["wit", "../other_wit_path"] +``` + +Notice in the [component/Makefile](component/Makefile) how the build command is simply `componentize-go build`. Contrast this with the other examples which explicitly specify WIT worlds and paths to the WIT files in their build commands. The [pkg/componentize-go.toml](pkg/componentize-go.toml) file is what enables this behavior. + +When building a component, componentize-go will search the go.mod file's dependencies' respective repositories for a componentize-go.toml file in the root. This file indicates where the WIT files are stored and the default worlds that are to be used. + +You can override the default worlds via the command line. Note that doing so causes componentize-go to ignore all componentize-go.toml world definitions. You will need to explicitly list every WIT world the component requires. + +## Defining Imports + +Imports are straightforward since componentize-go generates the bindings. To see how imports are abstracted, see the [sockets package](pkg/sockets/sockets.go). + +## Defining Exports + +Exports require a bit more structure than imports because we need to have a translation layer for idiomatic, user-defined export functions and the raw WIT function signatures the compiler will recognize. + +**Step 1: Define an Exports variable** ([`pkg/bindings/exports/export_wasi_cli_run/wit_bindings.go`](pkg/bindings/exports/export_wasi_cli_run/wit_bindings.go)) + +We hand-write an `Exports` variable that contains an uninitialized slot for each function export. At startup, something will need to assign a function to each slot; otherwise, the export panics at runtime. We do it this way because the [generated export bindings](pkg/bindings//exports/wit_exports/wit_exports.go) expect a `Run` function in the `bindings/export_wasi_cli_run` package, and we want to avoid making manual edits to any of the generated files. + +**Step 2: The SDK wrapper** ([`pkg/cli/cli.go`](pkg/cli/cli.go)) + +The SDK defines a `RegisterExports` function that both assigns to the generated `Exports` slots and handles conversion between idiomatic Go types (e.g. `error`) and the raw WIT types (e.g. `witTypes.Option[string]`) the bindings expect. + +Note the required blank import of `wit_exports`, as the component will not compile without it. + +**Step 3: The application** ([`component/main.go`](component/main.go)) + +The application implements the required function export(s) and calls `RegisterExports` from `init()`. The `main()` function is left empty to make the compiler happy. diff --git a/examples/sdk/component/Makefile b/examples/sdk/component/Makefile new file mode 100644 index 0000000..9f986d0 --- /dev/null +++ b/examples/sdk/component/Makefile @@ -0,0 +1,7 @@ +.PHONY: run build + +build: + componentize-go build + +run: build + wasmtime run -S p3,inherit-network -W component-model-async main.wasm diff --git a/examples/sdk/component/README.md b/examples/sdk/component/README.md new file mode 100644 index 0000000..ca7f8c9 --- /dev/null +++ b/examples/sdk/component/README.md @@ -0,0 +1,18 @@ +# `sdk` example + +## Usage + +### Prerequisites + +- [**componentize-go**](https://github.com/bytecodealliance/componentize-go) - Latest version +- [**go**](https://go.dev/dl/) - v1.25.9 +- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v44.0.1 + +### Run + +```sh +make run + +# Invoke the application +curl localhost:6767 +``` diff --git a/examples/sdk/component/go.mod b/examples/sdk/component/go.mod new file mode 100644 index 0000000..7285adc --- /dev/null +++ b/examples/sdk/component/go.mod @@ -0,0 +1,9 @@ +module example + +go 1.25.5 + +replace pkg => ../pkg + +require pkg v0.0.0-00010101000000-000000000000 + +require go.bytecodealliance.org/pkg v0.2.1 // indirect diff --git a/examples/sdk/component/go.sum b/examples/sdk/component/go.sum new file mode 100644 index 0000000..a18d6dc --- /dev/null +++ b/examples/sdk/component/go.sum @@ -0,0 +1,2 @@ +go.bytecodealliance.org/pkg v0.2.1 h1:TdRagooIcCW3UmlKqVO4cDR3GNDyfDnbiBzGI6TOvyg= +go.bytecodealliance.org/pkg v0.2.1/go.mod h1:OjA+V8g3uUFixeCKFfamm6sYhTJdg8fvwEdJ2GO0GSk= diff --git a/examples/sdk/component/main.go b/examples/sdk/component/main.go new file mode 100644 index 0000000..30c50d9 --- /dev/null +++ b/examples/sdk/component/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "fmt" + "io" + wasiExports "pkg/cli" + wasiSockets "pkg/sockets" +) + +const numWorkers = 16 + +type Component struct{} + +func (c *Component) Run() error { + socket, err := wasiSockets.NewSocket(wasiSockets.IpAddressFamilyIpv4) + if err != nil { + return err + } + + if err := socket.Bind("0.0.0.0:6767"); err != nil { + return err + } + + listener, err := socket.Listen() + if err != nil { + return err + } + defer listener.Close() + + connCh := make(chan *wasiSockets.TcpSocket, numWorkers) + + for range numWorkers { + go func() { + for conn := range connCh { + handleConn(conn) + } + }() + } + + for { + conn, err := listener.Accept() + if err != nil { + close(connCh) + if err == io.EOF { + return nil + } + return err + } + connCh <- conn + } +} + +func handleConn(conn *wasiSockets.TcpSocket) { + body := "Hello from Go + wasi:sockets!" + response := fmt.Sprintf( + "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s", + len(body), body, + ) + conn.Write([]byte(response)) +} + +func init() { + wasiExports.RegisterExports(&Component{}) +} + +func main() {} diff --git a/examples/sdk/pkg/Makefile b/examples/sdk/pkg/Makefile new file mode 100644 index 0000000..675db34 --- /dev/null +++ b/examples/sdk/pkg/Makefile @@ -0,0 +1,14 @@ +generate-bindings: + @rm -rf bindings/imports + @rm -rf bindings/exports/wit_exports +# The export_wasi_cli_run files are hand-written, and thus are not removed + + @componentize-go \ + --ignore-toml-files \ + bindings \ + --output bindings/imports \ + --pkg-name pkg/bindings/imports \ + --export-pkg-name pkg/bindings/exports \ + --format + + @mv bindings/imports/wit_exports bindings/exports \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/empty.s b/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/wit_bindings.go b/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/wit_bindings.go new file mode 100644 index 0000000..7922adf --- /dev/null +++ b/examples/sdk/pkg/bindings/exports/export_wasi_cli_run/wit_bindings.go @@ -0,0 +1,15 @@ +// Note: This file was NOT generated by componentize-go + +package export_wasi_cli_run + +import ( + witTypes "go.bytecodealliance.org/pkg/wit/types" +) + +var Exports struct { + Run func() witTypes.Result[witTypes.Unit, witTypes.Unit] +} + +func Run() witTypes.Result[witTypes.Unit, witTypes.Unit] { + return Exports.Run() +} diff --git a/examples/sdk/pkg/bindings/exports/wit_exports/wit_exports.go b/examples/sdk/pkg/bindings/exports/wit_exports/wit_exports.go new file mode 100644 index 0000000..73c5b71 --- /dev/null +++ b/examples/sdk/pkg/bindings/exports/wit_exports/wit_exports.go @@ -0,0 +1,52 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wit_exports + +import ( + witAsync "go.bytecodealliance.org/pkg/wit/async" + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/exports/export_wasi_cli_run" + "runtime" +) + +var staticPinner = runtime.Pinner{} +var exportReturnArea = uintptr(witRuntime.Allocate(&staticPinner, 0, 1)) +var syncExportPinner = runtime.Pinner{} + +//go:wasmexport [async-lift]wasi:cli/run@0.3.0-rc-2026-03-15#run +func wasm_export_wasi_cli_run_run() int32 { + return int32(witAsync.Run(func() { + + result := export_wasi_cli_run.Run() + var option int32 + switch result.Tag() { + case witTypes.ResultOk: + + option = int32(0) + case witTypes.ResultErr: + + option = int32(1) + default: + panic("unreachable") + } + wasm_export_task_return_wasi_cli_run_run(option) + + })) +} + +//go:wasmexport [callback][async-lift]wasi:cli/run@0.3.0-rc-2026-03-15#run +func wasm_export_callback_wasi_cli_run_run(event0 uint32, event1 uint32, event2 uint32) uint32 { + return witAsync.Callback(event0, event1, event2) +} + +//go:wasmimport [export]wasi:cli/run@0.3.0-rc-2026-03-15 [task-return]run +func wasm_export_task_return_wasi_cli_run_run(arg0 int32) diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_environment/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_environment/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_environment/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_environment/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_environment/wit_bindings.go new file mode 100644 index 0000000..c952847 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_environment/wit_bindings.go @@ -0,0 +1,89 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_environment + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:cli/environment@0.3.0-rc-2026-03-15 get-environment +func wasm_import_get_environment(arg0 uintptr) + +func GetEnvironment() []witTypes.Tuple2[string, string] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (2 * 4), 4)) + wasm_import_get_environment(returnArea) + result := make([]witTypes.Tuple2[string, string], 0, *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) + for index := 0; index < int(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))); index++ { + base := unsafe.Add(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0)))), index*(4*4)) + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 0))))), *(*uint32)(unsafe.Add(unsafe.Pointer(base), 4))) + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(base), (2 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(base), (3 * 4)))) + + result = append(result, witTypes.Tuple2[string, string]{value, value0}) + } + + result1 := result + return result1 + +} + +//go:wasmimport wasi:cli/environment@0.3.0-rc-2026-03-15 get-arguments +func wasm_import_get_arguments(arg0 uintptr) + +func GetArguments() []string { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (2 * 4), 4)) + wasm_import_get_arguments(returnArea) + result := make([]string, 0, *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) + for index := 0; index < int(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))); index++ { + base := unsafe.Add(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0)))), index*(2*4)) + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 0))))), *(*uint32)(unsafe.Add(unsafe.Pointer(base), 4))) + + result = append(result, value) + } + + result0 := result + return result0 + +} + +//go:wasmimport wasi:cli/environment@0.3.0-rc-2026-03-15 get-initial-cwd +func wasm_import_get_initial_cwd(arg0 uintptr) + +func GetInitialCwd() witTypes.Option[string] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (3 * 4), 4)) + wasm_import_get_initial_cwd(returnArea) + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + result := option + return result + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_exit/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_exit/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_exit/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_exit/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_exit/wit_bindings.go new file mode 100644 index 0000000..ef6c5e4 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_exit/wit_bindings.go @@ -0,0 +1,35 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_exit + +import ( + witTypes "go.bytecodealliance.org/pkg/wit/types" +) + +//go:wasmimport wasi:cli/exit@0.3.0-rc-2026-03-15 exit +func wasm_import_exit(arg0 int32) + +func Exit(status witTypes.Result[witTypes.Unit, witTypes.Unit]) { + + var option int32 + switch status.Tag() { + case witTypes.ResultOk: + + option = int32(0) + case witTypes.ResultErr: + + option = int32(1) + default: + panic("unreachable") + } + wasm_import_exit(option) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/wit_bindings.go new file mode 100644 index 0000000..afe3e3a --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stderr/wit_bindings.go @@ -0,0 +1,107 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_stderr + +import ( + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 [future-new-1]write-via-stream +func wasm_future_new_result_unit_wasi_cli_types_error_code() uint64 + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 [async-lower][future-read-1]write-via-stream +func wasm_future_read_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 [async-lower][future-write-1]write-via-stream +func wasm_future_write_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 [future-drop-readable-1]write-via-stream +func wasm_future_drop_readable_result_unit_wasi_cli_types_error_code(handle int32) + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 [future-drop-writable-1]write-via-stream +func wasm_future_drop_writable_result_unit_wasi_cli_types_error_code(handle int32) + +func wasm_future_lift_result_unit_wasi_cli_types_error_code(src unsafe.Pointer) witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] { + var result witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, wasi_cli_types.ErrorCode](witTypes.Unit{}) + case 1: + + result = witTypes.Err[witTypes.Unit, wasi_cli_types.ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 1))))) + default: + panic("unreachable") + } + + return result +} + +func wasm_future_lower_result_unit_wasi_cli_types_error_code( + pinner *runtime.Pinner, + value witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode], + dst unsafe.Pointer, +) func() { + + switch value.Tag() { + case witTypes.ResultOk: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case witTypes.ResultErr: + payload := value.Err() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 1)) = int8(int32(payload)) + + default: + panic("unreachable") + } + + return func() {} +} + +var wasm_future_vtable_result_unit_wasi_cli_types_error_code = witTypes.FutureVtable[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]{ + 2, + 1, + wasm_future_read_result_unit_wasi_cli_types_error_code, + wasm_future_write_result_unit_wasi_cli_types_error_code, + nil, + nil, + wasm_future_drop_readable_result_unit_wasi_cli_types_error_code, + wasm_future_drop_writable_result_unit_wasi_cli_types_error_code, + wasm_future_lift_result_unit_wasi_cli_types_error_code, + wasm_future_lower_result_unit_wasi_cli_types_error_code, +} + +func MakeFutureResultUnitWasiCliTypesErrorCode() (*witTypes.FutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]) { + pair := wasm_future_new_result_unit_wasi_cli_types_error_code() + return witTypes.MakeFutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair>>32)), + witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair&0xFFFFFFFF)) +} + +func LiftFutureResultUnitWasiCliTypesErrorCode(handle int32) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]] { + return witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, handle) +} + +type ErrorCode = wasi_cli_types.ErrorCode + +//go:wasmimport wasi:cli/stderr@0.3.0-rc-2026-03-15 write-via-stream +func wasm_import_write_via_stream(arg0 int32) int32 + +func WriteViaStream(data *witTypes.StreamReader[uint8]) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]] { + + result := wasm_import_write_via_stream((data).TakeHandle()) + return LiftFutureResultUnitWasiCliTypesErrorCode(result) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/wit_bindings.go new file mode 100644 index 0000000..cdcb27e --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stdin/wit_bindings.go @@ -0,0 +1,151 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_stdin + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [stream-new-0]read-via-stream +func wasm_stream_new_u8() uint64 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [async-lower][stream-read-0]read-via-stream +func wasm_stream_read_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [async-lower][stream-write-0]read-via-stream +func wasm_stream_write_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [stream-drop-readable-0]read-via-stream +func wasm_stream_drop_readable_u8(handle int32) + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [stream-drop-writable-0]read-via-stream +func wasm_stream_drop_writable_u8(handle int32) + +var wasm_stream_vtable_u8 = witTypes.StreamVtable[uint8]{ + 1, + 1, + wasm_stream_read_u8, + wasm_stream_write_u8, + nil, + nil, + wasm_stream_drop_readable_u8, + wasm_stream_drop_writable_u8, + nil, + nil, +} + +func MakeStreamU8() (*witTypes.StreamWriter[uint8], *witTypes.StreamReader[uint8]) { + pair := wasm_stream_new_u8() + return witTypes.MakeStreamWriter[uint8](&wasm_stream_vtable_u8, int32(pair>>32)), + witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, int32(pair&0xFFFFFFFF)) +} + +func LiftStreamU8(handle int32) *witTypes.StreamReader[uint8] { + return witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, handle) +} + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [future-new-1]read-via-stream +func wasm_future_new_result_unit_wasi_cli_types_error_code() uint64 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [async-lower][future-read-1]read-via-stream +func wasm_future_read_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [async-lower][future-write-1]read-via-stream +func wasm_future_write_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [future-drop-readable-1]read-via-stream +func wasm_future_drop_readable_result_unit_wasi_cli_types_error_code(handle int32) + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 [future-drop-writable-1]read-via-stream +func wasm_future_drop_writable_result_unit_wasi_cli_types_error_code(handle int32) + +func wasm_future_lift_result_unit_wasi_cli_types_error_code(src unsafe.Pointer) witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] { + var result witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, wasi_cli_types.ErrorCode](witTypes.Unit{}) + case 1: + + result = witTypes.Err[witTypes.Unit, wasi_cli_types.ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 1))))) + default: + panic("unreachable") + } + + return result +} + +func wasm_future_lower_result_unit_wasi_cli_types_error_code( + pinner *runtime.Pinner, + value witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode], + dst unsafe.Pointer, +) func() { + + switch value.Tag() { + case witTypes.ResultOk: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case witTypes.ResultErr: + payload := value.Err() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 1)) = int8(int32(payload)) + + default: + panic("unreachable") + } + + return func() {} +} + +var wasm_future_vtable_result_unit_wasi_cli_types_error_code = witTypes.FutureVtable[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]{ + 2, + 1, + wasm_future_read_result_unit_wasi_cli_types_error_code, + wasm_future_write_result_unit_wasi_cli_types_error_code, + nil, + nil, + wasm_future_drop_readable_result_unit_wasi_cli_types_error_code, + wasm_future_drop_writable_result_unit_wasi_cli_types_error_code, + wasm_future_lift_result_unit_wasi_cli_types_error_code, + wasm_future_lower_result_unit_wasi_cli_types_error_code, +} + +func MakeFutureResultUnitWasiCliTypesErrorCode() (*witTypes.FutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]) { + pair := wasm_future_new_result_unit_wasi_cli_types_error_code() + return witTypes.MakeFutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair>>32)), + witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair&0xFFFFFFFF)) +} + +func LiftFutureResultUnitWasiCliTypesErrorCode(handle int32) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]] { + return witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, handle) +} + +type ErrorCode = wasi_cli_types.ErrorCode + +//go:wasmimport wasi:cli/stdin@0.3.0-rc-2026-03-15 read-via-stream +func wasm_import_read_via_stream(arg0 uintptr) + +func ReadViaStream() (*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]) { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_read_via_stream(returnArea) + result := witTypes.Tuple2[*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]]{LiftStreamU8(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 0))), LiftFutureResultUnitWasiCliTypesErrorCode(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))} + tuple := result + return tuple.F0, tuple.F1 + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/wit_bindings.go new file mode 100644 index 0000000..dde8d65 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_stdout/wit_bindings.go @@ -0,0 +1,107 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_stdout + +import ( + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 [future-new-1]write-via-stream +func wasm_future_new_result_unit_wasi_cli_types_error_code() uint64 + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 [async-lower][future-read-1]write-via-stream +func wasm_future_read_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 [async-lower][future-write-1]write-via-stream +func wasm_future_write_result_unit_wasi_cli_types_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 [future-drop-readable-1]write-via-stream +func wasm_future_drop_readable_result_unit_wasi_cli_types_error_code(handle int32) + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 [future-drop-writable-1]write-via-stream +func wasm_future_drop_writable_result_unit_wasi_cli_types_error_code(handle int32) + +func wasm_future_lift_result_unit_wasi_cli_types_error_code(src unsafe.Pointer) witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] { + var result witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, wasi_cli_types.ErrorCode](witTypes.Unit{}) + case 1: + + result = witTypes.Err[witTypes.Unit, wasi_cli_types.ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 1))))) + default: + panic("unreachable") + } + + return result +} + +func wasm_future_lower_result_unit_wasi_cli_types_error_code( + pinner *runtime.Pinner, + value witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode], + dst unsafe.Pointer, +) func() { + + switch value.Tag() { + case witTypes.ResultOk: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case witTypes.ResultErr: + payload := value.Err() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 1)) = int8(int32(payload)) + + default: + panic("unreachable") + } + + return func() {} +} + +var wasm_future_vtable_result_unit_wasi_cli_types_error_code = witTypes.FutureVtable[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]{ + 2, + 1, + wasm_future_read_result_unit_wasi_cli_types_error_code, + wasm_future_write_result_unit_wasi_cli_types_error_code, + nil, + nil, + wasm_future_drop_readable_result_unit_wasi_cli_types_error_code, + wasm_future_drop_writable_result_unit_wasi_cli_types_error_code, + wasm_future_lift_result_unit_wasi_cli_types_error_code, + wasm_future_lower_result_unit_wasi_cli_types_error_code, +} + +func MakeFutureResultUnitWasiCliTypesErrorCode() (*witTypes.FutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]]) { + pair := wasm_future_new_result_unit_wasi_cli_types_error_code() + return witTypes.MakeFutureWriter[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair>>32)), + witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, int32(pair&0xFFFFFFFF)) +} + +func LiftFutureResultUnitWasiCliTypesErrorCode(handle int32) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]] { + return witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]](&wasm_future_vtable_result_unit_wasi_cli_types_error_code, handle) +} + +type ErrorCode = wasi_cli_types.ErrorCode + +//go:wasmimport wasi:cli/stdout@0.3.0-rc-2026-03-15 write-via-stream +func wasm_import_write_via_stream(arg0 int32) int32 + +func WriteViaStream(data *witTypes.StreamReader[uint8]) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, wasi_cli_types.ErrorCode]] { + + result := wasm_import_write_via_stream((data).TakeHandle()) + return LiftFutureResultUnitWasiCliTypesErrorCode(result) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/wit_bindings.go new file mode 100644 index 0000000..bd1d688 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_input/wit_bindings.go @@ -0,0 +1,60 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_terminal_input + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + "runtime" +) + +//go:wasmimport wasi:cli/terminal-input@0.3.0-rc-2026-03-15 [resource-drop]terminal-input +func resourceDropTerminalInput(handle int32) + +// The input side of a terminal. +type TerminalInput struct { + handle *witRuntime.Handle +} + +func (self *TerminalInput) TakeHandle() int32 { + return self.handle.Take() +} + +func (self *TerminalInput) SetHandle(handle int32) { + self.handle.Set(handle) +} + +func (self *TerminalInput) Handle() int32 { + return self.handle.Use() +} + +func (self *TerminalInput) Drop() { + handle := self.handle.TakeOrNil() + if handle != 0 { + resourceDropTerminalInput(handle) + } +} + +func TerminalInputFromOwnHandle(handleValue int32) *TerminalInput { + handle := witRuntime.MakeHandle(handleValue) + value := &TerminalInput{handle} + runtime.AddCleanup(value, func(_ int) { + handleValue := handle.TakeOrNil() + if handleValue != 0 { + resourceDropTerminalInput(handleValue) + } + }, 0) + return value +} + +func TerminalInputFromBorrowHandle(handleValue int32) *TerminalInput { + handle := witRuntime.MakeHandle(handleValue) + return &TerminalInput{handle} +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/wit_bindings.go new file mode 100644 index 0000000..0f2ab1d --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_output/wit_bindings.go @@ -0,0 +1,60 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_terminal_output + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + "runtime" +) + +//go:wasmimport wasi:cli/terminal-output@0.3.0-rc-2026-03-15 [resource-drop]terminal-output +func resourceDropTerminalOutput(handle int32) + +// The output side of a terminal. +type TerminalOutput struct { + handle *witRuntime.Handle +} + +func (self *TerminalOutput) TakeHandle() int32 { + return self.handle.Take() +} + +func (self *TerminalOutput) SetHandle(handle int32) { + self.handle.Set(handle) +} + +func (self *TerminalOutput) Handle() int32 { + return self.handle.Use() +} + +func (self *TerminalOutput) Drop() { + handle := self.handle.TakeOrNil() + if handle != 0 { + resourceDropTerminalOutput(handle) + } +} + +func TerminalOutputFromOwnHandle(handleValue int32) *TerminalOutput { + handle := witRuntime.MakeHandle(handleValue) + value := &TerminalOutput{handle} + runtime.AddCleanup(value, func(_ int) { + handleValue := handle.TakeOrNil() + if handleValue != 0 { + resourceDropTerminalOutput(handleValue) + } + }, 0) + return value +} + +func TerminalOutputFromBorrowHandle(handleValue int32) *TerminalOutput { + handle := witRuntime.MakeHandle(handleValue) + return &TerminalOutput{handle} +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/wit_bindings.go new file mode 100644 index 0000000..efc04ef --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stderr/wit_bindings.go @@ -0,0 +1,46 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_terminal_stderr + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_terminal_output" + "runtime" + "unsafe" +) + +type TerminalOutput = wasi_cli_terminal_output.TerminalOutput + +//go:wasmimport wasi:cli/terminal-stderr@0.3.0-rc-2026-03-15 get-terminal-stderr +func wasm_import_get_terminal_stderr(arg0 uintptr) + +func GetTerminalStderr() witTypes.Option[*wasi_cli_terminal_output.TerminalOutput] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_get_terminal_stderr(returnArea) + var option witTypes.Option[*wasi_cli_terminal_output.TerminalOutput] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + option = witTypes.None[*wasi_cli_terminal_output.TerminalOutput]() + case 1: + + option = witTypes.Some[*wasi_cli_terminal_output.TerminalOutput](wasi_cli_terminal_output.TerminalOutputFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + default: + panic("unreachable") + } + result := option + return result + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/wit_bindings.go new file mode 100644 index 0000000..ad0b9f0 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdin/wit_bindings.go @@ -0,0 +1,46 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_terminal_stdin + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_terminal_input" + "runtime" + "unsafe" +) + +type TerminalInput = wasi_cli_terminal_input.TerminalInput + +//go:wasmimport wasi:cli/terminal-stdin@0.3.0-rc-2026-03-15 get-terminal-stdin +func wasm_import_get_terminal_stdin(arg0 uintptr) + +func GetTerminalStdin() witTypes.Option[*wasi_cli_terminal_input.TerminalInput] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_get_terminal_stdin(returnArea) + var option witTypes.Option[*wasi_cli_terminal_input.TerminalInput] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + option = witTypes.None[*wasi_cli_terminal_input.TerminalInput]() + case 1: + + option = witTypes.Some[*wasi_cli_terminal_input.TerminalInput](wasi_cli_terminal_input.TerminalInputFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + default: + panic("unreachable") + } + result := option + return result + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/wit_bindings.go new file mode 100644 index 0000000..1810fd3 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_terminal_stdout/wit_bindings.go @@ -0,0 +1,46 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_terminal_stdout + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_cli_terminal_output" + "runtime" + "unsafe" +) + +type TerminalOutput = wasi_cli_terminal_output.TerminalOutput + +//go:wasmimport wasi:cli/terminal-stdout@0.3.0-rc-2026-03-15 get-terminal-stdout +func wasm_import_get_terminal_stdout(arg0 uintptr) + +func GetTerminalStdout() witTypes.Option[*wasi_cli_terminal_output.TerminalOutput] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_get_terminal_stdout(returnArea) + var option witTypes.Option[*wasi_cli_terminal_output.TerminalOutput] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + option = witTypes.None[*wasi_cli_terminal_output.TerminalOutput]() + case 1: + + option = witTypes.Some[*wasi_cli_terminal_output.TerminalOutput](wasi_cli_terminal_output.TerminalOutputFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + default: + panic("unreachable") + } + result := option + return result + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_types/empty.s b/examples/sdk/pkg/bindings/imports/wasi_cli_types/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_types/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_cli_types/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_cli_types/wit_bindings.go new file mode 100644 index 0000000..2d69b72 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_cli_types/wit_bindings.go @@ -0,0 +1,24 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_cli_types + +import () + +const ( + // Input/output error + ErrorCodeIo uint8 = 0 + // Invalid or incomplete multibyte or wide character + ErrorCodeIllegalByteSequence uint8 = 1 + // Broken pipe + ErrorCodePipe uint8 = 2 +) + +type ErrorCode = uint8 diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/empty.s b/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/wit_bindings.go new file mode 100644 index 0000000..7dc0edb --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_monotonic_clock/wit_bindings.go @@ -0,0 +1,56 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_clocks_monotonic_clock + +import ( + witAsync "go.bytecodealliance.org/pkg/wit/async" +) + +type Duration = uint64 +type Mark = uint64 + +//go:wasmimport wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15 now +func wasm_import_now() int64 + +func Now() uint64 { + + result := wasm_import_now() + return uint64(result) + +} + +//go:wasmimport wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15 get-resolution +func wasm_import_get_resolution() int64 + +func GetResolution() uint64 { + + result := wasm_import_get_resolution() + return uint64(result) + +} + +//go:wasmimport wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15 [async-lower]wait-until +func wasm_import_wait_until(arg0 int64) int32 + +func WaitUntil(when uint64) { + + witAsync.SubtaskWait(uint32(wasm_import_wait_until(int64(when)))) + +} + +//go:wasmimport wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15 [async-lower]wait-for +func wasm_import_wait_for(arg0 int64) int32 + +func WaitFor(howLong uint64) { + + witAsync.SubtaskWait(uint32(wasm_import_wait_for(int64(howLong)))) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/empty.s b/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/wit_bindings.go new file mode 100644 index 0000000..29e3545 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_system_clock/wit_bindings.go @@ -0,0 +1,48 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_clocks_system_clock + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + "runtime" + "unsafe" +) + +type Duration = uint64 + +type Instant struct { + Seconds int64 + Nanoseconds uint32 +} + +//go:wasmimport wasi:clocks/system-clock@0.3.0-rc-2026-03-15 now +func wasm_import_now(arg0 uintptr) + +func Now() Instant { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 16, 8)) + wasm_import_now(returnArea) + result := Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 0)), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 8)))} + return result + +} + +//go:wasmimport wasi:clocks/system-clock@0.3.0-rc-2026-03-15 get-resolution +func wasm_import_get_resolution() int64 + +func GetResolution() uint64 { + + result := wasm_import_get_resolution() + return uint64(result) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_types/empty.s b/examples/sdk/pkg/bindings/imports/wasi_clocks_types/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_types/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_clocks_types/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_clocks_types/wit_bindings.go new file mode 100644 index 0000000..ef67fd1 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_clocks_types/wit_bindings.go @@ -0,0 +1,15 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_clocks_types + +import () + +type Duration = uint64 diff --git a/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/empty.s b/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/wit_bindings.go new file mode 100644 index 0000000..f6616ab --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_filesystem_preopens/wit_bindings.go @@ -0,0 +1,43 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_filesystem_preopens + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_filesystem_types" + "runtime" + "unsafe" +) + +type Descriptor = wasi_filesystem_types.Descriptor + +//go:wasmimport wasi:filesystem/preopens@0.3.0-rc-2026-03-15 get-directories +func wasm_import_get_directories(arg0 uintptr) + +func GetDirectories() []witTypes.Tuple2[*wasi_filesystem_types.Descriptor, string] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (2 * 4), 4)) + wasm_import_get_directories(returnArea) + result := make([]witTypes.Tuple2[*wasi_filesystem_types.Descriptor, string], 0, *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) + for index := 0; index < int(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))); index++ { + base := unsafe.Add(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0)))), index*(3*4)) + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 4))))), *(*uint32)(unsafe.Add(unsafe.Pointer(base), (2 * 4)))) + + result = append(result, witTypes.Tuple2[*wasi_filesystem_types.Descriptor, string]{wasi_filesystem_types.DescriptorFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(base), 0))))), value}) + } + + result0 := result + return result0 + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/empty.s b/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/wit_bindings.go new file mode 100644 index 0000000..173ca4d --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_filesystem_types/wit_bindings.go @@ -0,0 +1,5220 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_filesystem_types + +import ( + witAsync "go.bytecodealliance.org/pkg/wit/async" + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_clocks_system_clock" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-new-0][method]descriptor.read-via-stream +func wasm_stream_new_u8() uint64 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][stream-read-0][method]descriptor.read-via-stream +func wasm_stream_read_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][stream-write-0][method]descriptor.read-via-stream +func wasm_stream_write_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-drop-readable-0][method]descriptor.read-via-stream +func wasm_stream_drop_readable_u8(handle int32) + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-drop-writable-0][method]descriptor.read-via-stream +func wasm_stream_drop_writable_u8(handle int32) + +var wasm_stream_vtable_u8 = witTypes.StreamVtable[uint8]{ + 1, + 1, + wasm_stream_read_u8, + wasm_stream_write_u8, + nil, + nil, + wasm_stream_drop_readable_u8, + wasm_stream_drop_writable_u8, + nil, + nil, +} + +func MakeStreamU8() (*witTypes.StreamWriter[uint8], *witTypes.StreamReader[uint8]) { + pair := wasm_stream_new_u8() + return witTypes.MakeStreamWriter[uint8](&wasm_stream_vtable_u8, int32(pair>>32)), + witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, int32(pair&0xFFFFFFFF)) +} + +func LiftStreamU8(handle int32) *witTypes.StreamReader[uint8] { + return witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, handle) +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [future-new-1][method]descriptor.read-via-stream +func wasm_future_new_result_unit_error_code() uint64 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][future-read-1][method]descriptor.read-via-stream +func wasm_future_read_result_unit_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][future-write-1][method]descriptor.read-via-stream +func wasm_future_write_result_unit_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [future-drop-readable-1][method]descriptor.read-via-stream +func wasm_future_drop_readable_result_unit_error_code(handle int32) + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [future-drop-writable-1][method]descriptor.read-via-stream +func wasm_future_drop_writable_result_unit_error_code(handle int32) + +func wasm_future_lift_result_unit_error_code(src unsafe.Pointer) witTypes.Result[witTypes.Unit, ErrorCode] { + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(src), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result +} + +func wasm_future_lower_result_unit_error_code( + pinner *runtime.Pinner, + value witTypes.Result[witTypes.Unit, ErrorCode], + dst unsafe.Pointer, +) func() { + + switch value.Tag() { + case witTypes.ResultOk: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case witTypes.ResultErr: + payload := value.Err() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + + switch payload.Tag() { + case ErrorCodeAccess: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(0)) + + case ErrorCodeAlready: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(1)) + + case ErrorCodeBadDescriptor: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(2)) + + case ErrorCodeBusy: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(3)) + + case ErrorCodeDeadlock: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(4)) + + case ErrorCodeQuota: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(5)) + + case ErrorCodeExist: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(6)) + + case ErrorCodeFileTooLarge: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(7)) + + case ErrorCodeIllegalByteSequence: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(8)) + + case ErrorCodeInProgress: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(9)) + + case ErrorCodeInterrupted: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(10)) + + case ErrorCodeInvalid: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(11)) + + case ErrorCodeIo: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(12)) + + case ErrorCodeIsDirectory: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(13)) + + case ErrorCodeLoop: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(14)) + + case ErrorCodeTooManyLinks: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(15)) + + case ErrorCodeMessageSize: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(16)) + + case ErrorCodeNameTooLong: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(17)) + + case ErrorCodeNoDevice: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(18)) + + case ErrorCodeNoEntry: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(19)) + + case ErrorCodeNoLock: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(20)) + + case ErrorCodeInsufficientMemory: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(21)) + + case ErrorCodeInsufficientSpace: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(22)) + + case ErrorCodeNotDirectory: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(23)) + + case ErrorCodeNotEmpty: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(24)) + + case ErrorCodeNotRecoverable: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(25)) + + case ErrorCodeUnsupported: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(26)) + + case ErrorCodeNoTty: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(27)) + + case ErrorCodeNoSuchDevice: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(28)) + + case ErrorCodeOverflow: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(29)) + + case ErrorCodeNotPermitted: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(30)) + + case ErrorCodePipe: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(31)) + + case ErrorCodeReadOnly: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(32)) + + case ErrorCodeInvalidSeek: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(33)) + + case ErrorCodeTextFileBusy: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(34)) + + case ErrorCodeCrossDevice: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(35)) + + case ErrorCodeOther: + payload := payload.Other() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(36)) + + switch payload.Tag() { + case witTypes.OptionNone: + *(*int8)(unsafe.Add(unsafe.Pointer(dst), (2 * 4))) = int8(int32(0)) + + case witTypes.OptionSome: + payload := payload.Some() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), (2 * 4))) = int8(int32(1)) + utf8 := unsafe.Pointer(unsafe.StringData(payload)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (4 * 4))) = uint32(uint32(len(payload))) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (3 * 4))) = uint32(uintptr(uintptr(utf8))) + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + + return func() {} +} + +var wasm_future_vtable_result_unit_error_code = witTypes.FutureVtable[witTypes.Result[witTypes.Unit, ErrorCode]]{ + (5 * 4), + 4, + wasm_future_read_result_unit_error_code, + wasm_future_write_result_unit_error_code, + nil, + nil, + wasm_future_drop_readable_result_unit_error_code, + wasm_future_drop_writable_result_unit_error_code, + wasm_future_lift_result_unit_error_code, + wasm_future_lower_result_unit_error_code, +} + +func MakeFutureResultUnitErrorCode() (*witTypes.FutureWriter[witTypes.Result[witTypes.Unit, ErrorCode]], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]) { + pair := wasm_future_new_result_unit_error_code() + return witTypes.MakeFutureWriter[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, int32(pair>>32)), + witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, int32(pair&0xFFFFFFFF)) +} + +func LiftFutureResultUnitErrorCode(handle int32) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]] { + return witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, handle) +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-new-0][method]descriptor.read-directory +func wasm_stream_new_directory_entry() uint64 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][stream-read-0][method]descriptor.read-directory +func wasm_stream_read_directory_entry(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][stream-write-0][method]descriptor.read-directory +func wasm_stream_write_directory_entry(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-drop-readable-0][method]descriptor.read-directory +func wasm_stream_drop_readable_directory_entry(handle int32) + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [stream-drop-writable-0][method]descriptor.read-directory +func wasm_stream_drop_writable_directory_entry(handle int32) + +func wasm_stream_lift_directory_entry(src unsafe.Pointer) DirectoryEntry { + var variant DescriptorType + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + variant = MakeDescriptorTypeBlockDevice() + + case 1: + + variant = MakeDescriptorTypeCharacterDevice() + + case 2: + + variant = MakeDescriptorTypeDirectory() + + case 3: + + variant = MakeDescriptorTypeFifo() + + case 4: + + variant = MakeDescriptorTypeSymbolicLink() + + case 5: + + variant = MakeDescriptorTypeRegularFile() + + case 6: + + variant = MakeDescriptorTypeSocket() + + case 7: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 4))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (2 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(src), (3 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeDescriptorTypeOther(option) + + default: + panic("unreachable") + } + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (4 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(src), (5 * 4)))) + + return DirectoryEntry{variant, value0} +} + +func wasm_stream_lower_directory_entry( + pinner *runtime.Pinner, + value DirectoryEntry, + dst unsafe.Pointer, +) func() { + + switch (value).Type.Tag() { + case DescriptorTypeBlockDevice: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case DescriptorTypeCharacterDevice: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + + case DescriptorTypeDirectory: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(2)) + + case DescriptorTypeFifo: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(3)) + + case DescriptorTypeSymbolicLink: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(4)) + + case DescriptorTypeRegularFile: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(5)) + + case DescriptorTypeSocket: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(6)) + + case DescriptorTypeOther: + payload := (value).Type.Other() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(7)) + + switch payload.Tag() { + case witTypes.OptionNone: + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(0)) + + case witTypes.OptionSome: + payload := payload.Some() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(1)) + utf8 := unsafe.Pointer(unsafe.StringData(payload)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (3 * 4))) = uint32(uint32(len(payload))) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (2 * 4))) = uint32(uintptr(uintptr(utf8))) + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + utf81 := unsafe.Pointer(unsafe.StringData((value).Name)) + pinner.Pin(utf81) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (5 * 4))) = uint32(uint32(len((value).Name))) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (4 * 4))) = uint32(uintptr(uintptr(utf81))) + + return func() {} +} + +var wasm_stream_vtable_directory_entry = witTypes.StreamVtable[DirectoryEntry]{ + (6 * 4), + 4, + wasm_stream_read_directory_entry, + wasm_stream_write_directory_entry, + nil, + nil, + wasm_stream_drop_readable_directory_entry, + wasm_stream_drop_writable_directory_entry, + wasm_stream_lift_directory_entry, + wasm_stream_lower_directory_entry, +} + +func MakeStreamDirectoryEntry() (*witTypes.StreamWriter[DirectoryEntry], *witTypes.StreamReader[DirectoryEntry]) { + pair := wasm_stream_new_directory_entry() + return witTypes.MakeStreamWriter[DirectoryEntry](&wasm_stream_vtable_directory_entry, int32(pair>>32)), + witTypes.MakeStreamReader[DirectoryEntry](&wasm_stream_vtable_directory_entry, int32(pair&0xFFFFFFFF)) +} + +func LiftStreamDirectoryEntry(handle int32) *witTypes.StreamReader[DirectoryEntry] { + return witTypes.MakeStreamReader[DirectoryEntry](&wasm_stream_vtable_directory_entry, handle) +} + +type Instant = wasi_clocks_system_clock.Instant +type Filesize = uint64 + +const ( + DescriptorTypeBlockDevice uint8 = 0 + DescriptorTypeCharacterDevice uint8 = 1 + DescriptorTypeDirectory uint8 = 2 + DescriptorTypeFifo uint8 = 3 + DescriptorTypeSymbolicLink uint8 = 4 + DescriptorTypeRegularFile uint8 = 5 + DescriptorTypeSocket uint8 = 6 + DescriptorTypeOther uint8 = 7 +) + +type DescriptorType struct { + tag uint8 + value any +} + +func (self DescriptorType) Tag() uint8 { + return self.tag +} + +func (self DescriptorType) Other() witTypes.Option[string] { + if self.tag != DescriptorTypeOther { + panic("tag mismatch") + } + return self.value.(witTypes.Option[string]) +} + +func MakeDescriptorTypeBlockDevice() DescriptorType { + return DescriptorType{DescriptorTypeBlockDevice, nil} +} +func MakeDescriptorTypeCharacterDevice() DescriptorType { + return DescriptorType{DescriptorTypeCharacterDevice, nil} +} +func MakeDescriptorTypeDirectory() DescriptorType { + return DescriptorType{DescriptorTypeDirectory, nil} +} +func MakeDescriptorTypeFifo() DescriptorType { + return DescriptorType{DescriptorTypeFifo, nil} +} +func MakeDescriptorTypeSymbolicLink() DescriptorType { + return DescriptorType{DescriptorTypeSymbolicLink, nil} +} +func MakeDescriptorTypeRegularFile() DescriptorType { + return DescriptorType{DescriptorTypeRegularFile, nil} +} +func MakeDescriptorTypeSocket() DescriptorType { + return DescriptorType{DescriptorTypeSocket, nil} +} +func MakeDescriptorTypeOther(value witTypes.Option[string]) DescriptorType { + return DescriptorType{DescriptorTypeOther, value} +} + +const ( + DescriptorFlagsRead uint8 = 1 << 0 + DescriptorFlagsWrite uint8 = 1 << 1 + DescriptorFlagsFileIntegritySync uint8 = 1 << 2 + DescriptorFlagsDataIntegritySync uint8 = 1 << 3 + DescriptorFlagsRequestedWriteSync uint8 = 1 << 4 + DescriptorFlagsMutateDirectory uint8 = 1 << 5 +) + +type DescriptorFlags = uint8 + +const ( + PathFlagsSymlinkFollow uint8 = 1 << 0 +) + +type PathFlags = uint8 + +const ( + OpenFlagsCreate uint8 = 1 << 0 + OpenFlagsDirectory uint8 = 1 << 1 + OpenFlagsExclusive uint8 = 1 << 2 + OpenFlagsTruncate uint8 = 1 << 3 +) + +type OpenFlags = uint8 +type LinkCount = uint64 + +type DescriptorStat struct { + Type DescriptorType + LinkCount uint64 + Size uint64 + DataAccessTimestamp witTypes.Option[wasi_clocks_system_clock.Instant] + DataModificationTimestamp witTypes.Option[wasi_clocks_system_clock.Instant] + StatusChangeTimestamp witTypes.Option[wasi_clocks_system_clock.Instant] +} + +const ( + NewTimestampNoChange uint8 = 0 + NewTimestampNow uint8 = 1 + NewTimestampTimestamp uint8 = 2 +) + +type NewTimestamp struct { + tag uint8 + value any +} + +func (self NewTimestamp) Tag() uint8 { + return self.tag +} + +func (self NewTimestamp) Timestamp() wasi_clocks_system_clock.Instant { + if self.tag != NewTimestampTimestamp { + panic("tag mismatch") + } + return self.value.(wasi_clocks_system_clock.Instant) +} + +func MakeNewTimestampNoChange() NewTimestamp { + return NewTimestamp{NewTimestampNoChange, nil} +} +func MakeNewTimestampNow() NewTimestamp { + return NewTimestamp{NewTimestampNow, nil} +} +func MakeNewTimestampTimestamp(value wasi_clocks_system_clock.Instant) NewTimestamp { + return NewTimestamp{NewTimestampTimestamp, value} +} + +type DirectoryEntry struct { + Type DescriptorType + Name string +} + +const ( + ErrorCodeAccess uint8 = 0 + ErrorCodeAlready uint8 = 1 + ErrorCodeBadDescriptor uint8 = 2 + ErrorCodeBusy uint8 = 3 + ErrorCodeDeadlock uint8 = 4 + ErrorCodeQuota uint8 = 5 + ErrorCodeExist uint8 = 6 + ErrorCodeFileTooLarge uint8 = 7 + ErrorCodeIllegalByteSequence uint8 = 8 + ErrorCodeInProgress uint8 = 9 + ErrorCodeInterrupted uint8 = 10 + ErrorCodeInvalid uint8 = 11 + ErrorCodeIo uint8 = 12 + ErrorCodeIsDirectory uint8 = 13 + ErrorCodeLoop uint8 = 14 + ErrorCodeTooManyLinks uint8 = 15 + ErrorCodeMessageSize uint8 = 16 + ErrorCodeNameTooLong uint8 = 17 + ErrorCodeNoDevice uint8 = 18 + ErrorCodeNoEntry uint8 = 19 + ErrorCodeNoLock uint8 = 20 + ErrorCodeInsufficientMemory uint8 = 21 + ErrorCodeInsufficientSpace uint8 = 22 + ErrorCodeNotDirectory uint8 = 23 + ErrorCodeNotEmpty uint8 = 24 + ErrorCodeNotRecoverable uint8 = 25 + ErrorCodeUnsupported uint8 = 26 + ErrorCodeNoTty uint8 = 27 + ErrorCodeNoSuchDevice uint8 = 28 + ErrorCodeOverflow uint8 = 29 + ErrorCodeNotPermitted uint8 = 30 + ErrorCodePipe uint8 = 31 + ErrorCodeReadOnly uint8 = 32 + ErrorCodeInvalidSeek uint8 = 33 + ErrorCodeTextFileBusy uint8 = 34 + ErrorCodeCrossDevice uint8 = 35 + ErrorCodeOther uint8 = 36 +) + +type ErrorCode struct { + tag uint8 + value any +} + +func (self ErrorCode) Tag() uint8 { + return self.tag +} + +func (self ErrorCode) Other() witTypes.Option[string] { + if self.tag != ErrorCodeOther { + panic("tag mismatch") + } + return self.value.(witTypes.Option[string]) +} + +func MakeErrorCodeAccess() ErrorCode { + return ErrorCode{ErrorCodeAccess, nil} +} +func MakeErrorCodeAlready() ErrorCode { + return ErrorCode{ErrorCodeAlready, nil} +} +func MakeErrorCodeBadDescriptor() ErrorCode { + return ErrorCode{ErrorCodeBadDescriptor, nil} +} +func MakeErrorCodeBusy() ErrorCode { + return ErrorCode{ErrorCodeBusy, nil} +} +func MakeErrorCodeDeadlock() ErrorCode { + return ErrorCode{ErrorCodeDeadlock, nil} +} +func MakeErrorCodeQuota() ErrorCode { + return ErrorCode{ErrorCodeQuota, nil} +} +func MakeErrorCodeExist() ErrorCode { + return ErrorCode{ErrorCodeExist, nil} +} +func MakeErrorCodeFileTooLarge() ErrorCode { + return ErrorCode{ErrorCodeFileTooLarge, nil} +} +func MakeErrorCodeIllegalByteSequence() ErrorCode { + return ErrorCode{ErrorCodeIllegalByteSequence, nil} +} +func MakeErrorCodeInProgress() ErrorCode { + return ErrorCode{ErrorCodeInProgress, nil} +} +func MakeErrorCodeInterrupted() ErrorCode { + return ErrorCode{ErrorCodeInterrupted, nil} +} +func MakeErrorCodeInvalid() ErrorCode { + return ErrorCode{ErrorCodeInvalid, nil} +} +func MakeErrorCodeIo() ErrorCode { + return ErrorCode{ErrorCodeIo, nil} +} +func MakeErrorCodeIsDirectory() ErrorCode { + return ErrorCode{ErrorCodeIsDirectory, nil} +} +func MakeErrorCodeLoop() ErrorCode { + return ErrorCode{ErrorCodeLoop, nil} +} +func MakeErrorCodeTooManyLinks() ErrorCode { + return ErrorCode{ErrorCodeTooManyLinks, nil} +} +func MakeErrorCodeMessageSize() ErrorCode { + return ErrorCode{ErrorCodeMessageSize, nil} +} +func MakeErrorCodeNameTooLong() ErrorCode { + return ErrorCode{ErrorCodeNameTooLong, nil} +} +func MakeErrorCodeNoDevice() ErrorCode { + return ErrorCode{ErrorCodeNoDevice, nil} +} +func MakeErrorCodeNoEntry() ErrorCode { + return ErrorCode{ErrorCodeNoEntry, nil} +} +func MakeErrorCodeNoLock() ErrorCode { + return ErrorCode{ErrorCodeNoLock, nil} +} +func MakeErrorCodeInsufficientMemory() ErrorCode { + return ErrorCode{ErrorCodeInsufficientMemory, nil} +} +func MakeErrorCodeInsufficientSpace() ErrorCode { + return ErrorCode{ErrorCodeInsufficientSpace, nil} +} +func MakeErrorCodeNotDirectory() ErrorCode { + return ErrorCode{ErrorCodeNotDirectory, nil} +} +func MakeErrorCodeNotEmpty() ErrorCode { + return ErrorCode{ErrorCodeNotEmpty, nil} +} +func MakeErrorCodeNotRecoverable() ErrorCode { + return ErrorCode{ErrorCodeNotRecoverable, nil} +} +func MakeErrorCodeUnsupported() ErrorCode { + return ErrorCode{ErrorCodeUnsupported, nil} +} +func MakeErrorCodeNoTty() ErrorCode { + return ErrorCode{ErrorCodeNoTty, nil} +} +func MakeErrorCodeNoSuchDevice() ErrorCode { + return ErrorCode{ErrorCodeNoSuchDevice, nil} +} +func MakeErrorCodeOverflow() ErrorCode { + return ErrorCode{ErrorCodeOverflow, nil} +} +func MakeErrorCodeNotPermitted() ErrorCode { + return ErrorCode{ErrorCodeNotPermitted, nil} +} +func MakeErrorCodePipe() ErrorCode { + return ErrorCode{ErrorCodePipe, nil} +} +func MakeErrorCodeReadOnly() ErrorCode { + return ErrorCode{ErrorCodeReadOnly, nil} +} +func MakeErrorCodeInvalidSeek() ErrorCode { + return ErrorCode{ErrorCodeInvalidSeek, nil} +} +func MakeErrorCodeTextFileBusy() ErrorCode { + return ErrorCode{ErrorCodeTextFileBusy, nil} +} +func MakeErrorCodeCrossDevice() ErrorCode { + return ErrorCode{ErrorCodeCrossDevice, nil} +} +func MakeErrorCodeOther(value witTypes.Option[string]) ErrorCode { + return ErrorCode{ErrorCodeOther, value} +} + +const ( + AdviceNormal uint8 = 0 + AdviceSequential uint8 = 1 + AdviceRandom uint8 = 2 + AdviceWillNeed uint8 = 3 + AdviceDontNeed uint8 = 4 + AdviceNoReuse uint8 = 5 +) + +type Advice = uint8 + +type MetadataHashValue struct { + Lower uint64 + Upper uint64 +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [resource-drop]descriptor +func resourceDropDescriptor(handle int32) + +type Descriptor struct { + handle *witRuntime.Handle +} + +func (self *Descriptor) TakeHandle() int32 { + return self.handle.Take() +} + +func (self *Descriptor) SetHandle(handle int32) { + self.handle.Set(handle) +} + +func (self *Descriptor) Handle() int32 { + return self.handle.Use() +} + +func (self *Descriptor) Drop() { + handle := self.handle.TakeOrNil() + if handle != 0 { + resourceDropDescriptor(handle) + } +} + +func DescriptorFromOwnHandle(handleValue int32) *Descriptor { + handle := witRuntime.MakeHandle(handleValue) + value := &Descriptor{handle} + runtime.AddCleanup(value, func(_ int) { + handleValue := handle.TakeOrNil() + if handleValue != 0 { + resourceDropDescriptor(handleValue) + } + }, 0) + return value +} + +func DescriptorFromBorrowHandle(handleValue int32) *Descriptor { + handle := witRuntime.MakeHandle(handleValue) + return &Descriptor{handle} +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [method]descriptor.read-via-stream +func wasm_import_method_descriptor_read_via_stream(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *Descriptor) ReadViaStream(offset uint64) (*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]) { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_method_descriptor_read_via_stream((self).Handle(), int64(offset), returnArea) + result := witTypes.Tuple2[*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]]{LiftStreamU8(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 0))), LiftFutureResultUnitErrorCode(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))} + tuple := result + return tuple.F0, tuple.F1 + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [method]descriptor.write-via-stream +func wasm_import_method_descriptor_write_via_stream(arg0 int32, arg1 int32, arg2 int64) int32 + +func (self *Descriptor) WriteViaStream(data *witTypes.StreamReader[uint8], offset uint64) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]] { + + result := wasm_import_method_descriptor_write_via_stream((self).Handle(), (data).TakeHandle(), int64(offset)) + return LiftFutureResultUnitErrorCode(result) + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [method]descriptor.append-via-stream +func wasm_import_method_descriptor_append_via_stream(arg0 int32, arg1 int32) int32 + +func (self *Descriptor) AppendViaStream(data *witTypes.StreamReader[uint8]) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]] { + + result := wasm_import_method_descriptor_append_via_stream((self).Handle(), (data).TakeHandle()) + return LiftFutureResultUnitErrorCode(result) + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.advise +func wasm_import_method_descriptor_advise(arg0 int32, arg1 int64, arg2 int64, arg3 int32, arg4 uintptr) int32 + +func (self *Descriptor) Advise(offset uint64, length uint64, advice Advice) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_advise((self).Handle(), int64(offset), int64(length), int32(advice), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.sync-data +func wasm_import_method_descriptor_sync_data(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) SyncData() witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_sync_data((self).Handle(), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.get-flags +func wasm_import_method_descriptor_get_flags(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) GetFlags() witTypes.Result[DescriptorFlags, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_get_flags((self).Handle(), returnArea))) + var result witTypes.Result[DescriptorFlags, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[DescriptorFlags, ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[DescriptorFlags, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.get-type +func wasm_import_method_descriptor_get_type(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) GetType() witTypes.Result[DescriptorType, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_get_type((self).Handle(), returnArea))) + var result witTypes.Result[DescriptorType, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant DescriptorType + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeDescriptorTypeBlockDevice() + + case 1: + + variant = MakeDescriptorTypeCharacterDevice() + + case 2: + + variant = MakeDescriptorTypeDirectory() + + case 3: + + variant = MakeDescriptorTypeFifo() + + case 4: + + variant = MakeDescriptorTypeSymbolicLink() + + case 5: + + variant = MakeDescriptorTypeRegularFile() + + case 6: + + variant = MakeDescriptorTypeSocket() + + case 7: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeDescriptorTypeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Ok[DescriptorType, ErrorCode](variant) + case 1: + var variant2 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant2 = MakeErrorCodeAccess() + + case 1: + + variant2 = MakeErrorCodeAlready() + + case 2: + + variant2 = MakeErrorCodeBadDescriptor() + + case 3: + + variant2 = MakeErrorCodeBusy() + + case 4: + + variant2 = MakeErrorCodeDeadlock() + + case 5: + + variant2 = MakeErrorCodeQuota() + + case 6: + + variant2 = MakeErrorCodeExist() + + case 7: + + variant2 = MakeErrorCodeFileTooLarge() + + case 8: + + variant2 = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant2 = MakeErrorCodeInProgress() + + case 10: + + variant2 = MakeErrorCodeInterrupted() + + case 11: + + variant2 = MakeErrorCodeInvalid() + + case 12: + + variant2 = MakeErrorCodeIo() + + case 13: + + variant2 = MakeErrorCodeIsDirectory() + + case 14: + + variant2 = MakeErrorCodeLoop() + + case 15: + + variant2 = MakeErrorCodeTooManyLinks() + + case 16: + + variant2 = MakeErrorCodeMessageSize() + + case 17: + + variant2 = MakeErrorCodeNameTooLong() + + case 18: + + variant2 = MakeErrorCodeNoDevice() + + case 19: + + variant2 = MakeErrorCodeNoEntry() + + case 20: + + variant2 = MakeErrorCodeNoLock() + + case 21: + + variant2 = MakeErrorCodeInsufficientMemory() + + case 22: + + variant2 = MakeErrorCodeInsufficientSpace() + + case 23: + + variant2 = MakeErrorCodeNotDirectory() + + case 24: + + variant2 = MakeErrorCodeNotEmpty() + + case 25: + + variant2 = MakeErrorCodeNotRecoverable() + + case 26: + + variant2 = MakeErrorCodeUnsupported() + + case 27: + + variant2 = MakeErrorCodeNoTty() + + case 28: + + variant2 = MakeErrorCodeNoSuchDevice() + + case 29: + + variant2 = MakeErrorCodeOverflow() + + case 30: + + variant2 = MakeErrorCodeNotPermitted() + + case 31: + + variant2 = MakeErrorCodePipe() + + case 32: + + variant2 = MakeErrorCodeReadOnly() + + case 33: + + variant2 = MakeErrorCodeInvalidSeek() + + case 34: + + variant2 = MakeErrorCodeTextFileBusy() + + case 35: + + variant2 = MakeErrorCodeCrossDevice() + + case 36: + var option1 witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option1 = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option1 = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant2 = MakeErrorCodeOther(option1) + + default: + panic("unreachable") + } + + result = witTypes.Err[DescriptorType, ErrorCode](variant2) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.set-size +func wasm_import_method_descriptor_set_size(arg0 int32, arg1 int64, arg2 uintptr) int32 + +func (self *Descriptor) SetSize(size uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_set_size((self).Handle(), int64(size), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.set-times +func wasm_import_method_descriptor_set_times(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) SetTimes(dataAccessTimestamp NewTimestamp, dataModificationTimestamp NewTimestamp) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, 56, 8) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + + switch dataAccessTimestamp.Tag() { + case NewTimestampNoChange: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = int8(int32(0)) + + case NewTimestampNow: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = int8(int32(1)) + + case NewTimestampTimestamp: + payload := dataAccessTimestamp.Timestamp() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = int8(int32(2)) + *(*int64)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 8)) = (payload).Seconds + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 16)) = int32((payload).Nanoseconds) + + default: + panic("unreachable") + } + + switch dataModificationTimestamp.Tag() { + case NewTimestampNoChange: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 32)), 0)) = int8(int32(0)) + + case NewTimestampNow: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 32)), 0)) = int8(int32(1)) + + case NewTimestampTimestamp: + payload := dataModificationTimestamp.Timestamp() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 32)), 0)) = int8(int32(2)) + *(*int64)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 32)), 8)) = (payload).Seconds + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 32)), 16)) = int32((payload).Nanoseconds) + + default: + panic("unreachable") + } + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_set_times(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [method]descriptor.read-directory +func wasm_import_method_descriptor_read_directory(arg0 int32, arg1 uintptr) + +func (self *Descriptor) ReadDirectory() (*witTypes.StreamReader[DirectoryEntry], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]) { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_method_descriptor_read_directory((self).Handle(), returnArea) + result := witTypes.Tuple2[*witTypes.StreamReader[DirectoryEntry], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]]{LiftStreamDirectoryEntry(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 0))), LiftFutureResultUnitErrorCode(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))} + tuple := result + return tuple.F0, tuple.F1 + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.sync +func wasm_import_method_descriptor_sync(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) Sync() witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_sync((self).Handle(), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.create-directory-at +func wasm_import_method_descriptor_create_directory_at(arg0 int32, arg1 uintptr, arg2 uint32, arg3 uintptr) int32 + +func (self *Descriptor) CreateDirectoryAt(path string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_create_directory_at((self).Handle(), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.stat +func wasm_import_method_descriptor_stat(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) Stat() witTypes.Result[DescriptorStat, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (96 + 4*4), 8)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_stat((self).Handle(), returnArea))) + var result witTypes.Result[DescriptorStat, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant DescriptorType + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeDescriptorTypeBlockDevice() + + case 1: + + variant = MakeDescriptorTypeCharacterDevice() + + case 2: + + variant = MakeDescriptorTypeDirectory() + + case 3: + + variant = MakeDescriptorTypeFifo() + + case 4: + + variant = MakeDescriptorTypeSymbolicLink() + + case 5: + + variant = MakeDescriptorTypeRegularFile() + + case 6: + + variant = MakeDescriptorTypeSocket() + + case 7: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeDescriptorTypeOther(option) + + default: + panic("unreachable") + } + var option0 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 4*4)))) { + case 0: + + option0 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option0 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (32 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (40 + 4*4))))}) + default: + panic("unreachable") + } + var option1 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (48 + 4*4)))) { + case 0: + + option1 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option1 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (56 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (64 + 4*4))))}) + default: + panic("unreachable") + } + var option2 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (72 + 4*4)))) { + case 0: + + option2 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option2 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (80 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (88 + 4*4))))}) + default: + panic("unreachable") + } + + result = witTypes.Ok[DescriptorStat, ErrorCode](DescriptorStat{variant, uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 4*4)))), uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 4*4)))), option0, option1, option2}) + case 1: + var variant5 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant5 = MakeErrorCodeAccess() + + case 1: + + variant5 = MakeErrorCodeAlready() + + case 2: + + variant5 = MakeErrorCodeBadDescriptor() + + case 3: + + variant5 = MakeErrorCodeBusy() + + case 4: + + variant5 = MakeErrorCodeDeadlock() + + case 5: + + variant5 = MakeErrorCodeQuota() + + case 6: + + variant5 = MakeErrorCodeExist() + + case 7: + + variant5 = MakeErrorCodeFileTooLarge() + + case 8: + + variant5 = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant5 = MakeErrorCodeInProgress() + + case 10: + + variant5 = MakeErrorCodeInterrupted() + + case 11: + + variant5 = MakeErrorCodeInvalid() + + case 12: + + variant5 = MakeErrorCodeIo() + + case 13: + + variant5 = MakeErrorCodeIsDirectory() + + case 14: + + variant5 = MakeErrorCodeLoop() + + case 15: + + variant5 = MakeErrorCodeTooManyLinks() + + case 16: + + variant5 = MakeErrorCodeMessageSize() + + case 17: + + variant5 = MakeErrorCodeNameTooLong() + + case 18: + + variant5 = MakeErrorCodeNoDevice() + + case 19: + + variant5 = MakeErrorCodeNoEntry() + + case 20: + + variant5 = MakeErrorCodeNoLock() + + case 21: + + variant5 = MakeErrorCodeInsufficientMemory() + + case 22: + + variant5 = MakeErrorCodeInsufficientSpace() + + case 23: + + variant5 = MakeErrorCodeNotDirectory() + + case 24: + + variant5 = MakeErrorCodeNotEmpty() + + case 25: + + variant5 = MakeErrorCodeNotRecoverable() + + case 26: + + variant5 = MakeErrorCodeUnsupported() + + case 27: + + variant5 = MakeErrorCodeNoTty() + + case 28: + + variant5 = MakeErrorCodeNoSuchDevice() + + case 29: + + variant5 = MakeErrorCodeOverflow() + + case 30: + + variant5 = MakeErrorCodeNotPermitted() + + case 31: + + variant5 = MakeErrorCodePipe() + + case 32: + + variant5 = MakeErrorCodeReadOnly() + + case 33: + + variant5 = MakeErrorCodeInvalidSeek() + + case 34: + + variant5 = MakeErrorCodeTextFileBusy() + + case 35: + + variant5 = MakeErrorCodeCrossDevice() + + case 36: + var option4 witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option4 = witTypes.None[string]() + case 1: + value3 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option4 = witTypes.Some[string](value3) + default: + panic("unreachable") + } + + variant5 = MakeErrorCodeOther(option4) + + default: + panic("unreachable") + } + + result = witTypes.Err[DescriptorStat, ErrorCode](variant5) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.stat-at +func wasm_import_method_descriptor_stat_at(arg0 int32, arg1 int32, arg2 uintptr, arg3 uint32, arg4 uintptr) int32 + +func (self *Descriptor) StatAt(pathFlags PathFlags, path string) witTypes.Result[DescriptorStat, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (96 + 4*4), 8)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_stat_at((self).Handle(), int32(pathFlags), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[DescriptorStat, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant DescriptorType + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeDescriptorTypeBlockDevice() + + case 1: + + variant = MakeDescriptorTypeCharacterDevice() + + case 2: + + variant = MakeDescriptorTypeDirectory() + + case 3: + + variant = MakeDescriptorTypeFifo() + + case 4: + + variant = MakeDescriptorTypeSymbolicLink() + + case 5: + + variant = MakeDescriptorTypeRegularFile() + + case 6: + + variant = MakeDescriptorTypeSocket() + + case 7: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeDescriptorTypeOther(option) + + default: + panic("unreachable") + } + var option0 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 4*4)))) { + case 0: + + option0 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option0 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (32 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (40 + 4*4))))}) + default: + panic("unreachable") + } + var option1 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (48 + 4*4)))) { + case 0: + + option1 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option1 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (56 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (64 + 4*4))))}) + default: + panic("unreachable") + } + var option2 witTypes.Option[wasi_clocks_system_clock.Instant] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (72 + 4*4)))) { + case 0: + + option2 = witTypes.None[wasi_clocks_system_clock.Instant]() + case 1: + + option2 = witTypes.Some[wasi_clocks_system_clock.Instant](wasi_clocks_system_clock.Instant{*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (80 + 4*4))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (88 + 4*4))))}) + default: + panic("unreachable") + } + + result = witTypes.Ok[DescriptorStat, ErrorCode](DescriptorStat{variant, uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 4*4)))), uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 4*4)))), option0, option1, option2}) + case 1: + var variant5 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant5 = MakeErrorCodeAccess() + + case 1: + + variant5 = MakeErrorCodeAlready() + + case 2: + + variant5 = MakeErrorCodeBadDescriptor() + + case 3: + + variant5 = MakeErrorCodeBusy() + + case 4: + + variant5 = MakeErrorCodeDeadlock() + + case 5: + + variant5 = MakeErrorCodeQuota() + + case 6: + + variant5 = MakeErrorCodeExist() + + case 7: + + variant5 = MakeErrorCodeFileTooLarge() + + case 8: + + variant5 = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant5 = MakeErrorCodeInProgress() + + case 10: + + variant5 = MakeErrorCodeInterrupted() + + case 11: + + variant5 = MakeErrorCodeInvalid() + + case 12: + + variant5 = MakeErrorCodeIo() + + case 13: + + variant5 = MakeErrorCodeIsDirectory() + + case 14: + + variant5 = MakeErrorCodeLoop() + + case 15: + + variant5 = MakeErrorCodeTooManyLinks() + + case 16: + + variant5 = MakeErrorCodeMessageSize() + + case 17: + + variant5 = MakeErrorCodeNameTooLong() + + case 18: + + variant5 = MakeErrorCodeNoDevice() + + case 19: + + variant5 = MakeErrorCodeNoEntry() + + case 20: + + variant5 = MakeErrorCodeNoLock() + + case 21: + + variant5 = MakeErrorCodeInsufficientMemory() + + case 22: + + variant5 = MakeErrorCodeInsufficientSpace() + + case 23: + + variant5 = MakeErrorCodeNotDirectory() + + case 24: + + variant5 = MakeErrorCodeNotEmpty() + + case 25: + + variant5 = MakeErrorCodeNotRecoverable() + + case 26: + + variant5 = MakeErrorCodeUnsupported() + + case 27: + + variant5 = MakeErrorCodeNoTty() + + case 28: + + variant5 = MakeErrorCodeNoSuchDevice() + + case 29: + + variant5 = MakeErrorCodeOverflow() + + case 30: + + variant5 = MakeErrorCodeNotPermitted() + + case 31: + + variant5 = MakeErrorCodePipe() + + case 32: + + variant5 = MakeErrorCodeReadOnly() + + case 33: + + variant5 = MakeErrorCodeInvalidSeek() + + case 34: + + variant5 = MakeErrorCodeTextFileBusy() + + case 35: + + variant5 = MakeErrorCodeCrossDevice() + + case 36: + var option4 witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option4 = witTypes.None[string]() + case 1: + value3 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option4 = witTypes.Some[string](value3) + default: + panic("unreachable") + } + + variant5 = MakeErrorCodeOther(option4) + + default: + panic("unreachable") + } + + result = witTypes.Err[DescriptorStat, ErrorCode](variant5) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.set-times-at +func wasm_import_method_descriptor_set_times_at(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) SetTimesAt(pathFlags PathFlags, path string, dataAccessTimestamp NewTimestamp, dataModificationTimestamp NewTimestamp) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (56 + 2*4), 8) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = int8(int32(pathFlags)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 4)) = uint32(uint32(len(path))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = uint32(uintptr(uintptr(utf8))) + + switch dataAccessTimestamp.Tag() { + case NewTimestampNoChange: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 0)) = int8(int32(0)) + + case NewTimestampNow: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 0)) = int8(int32(1)) + + case NewTimestampTimestamp: + payload := dataAccessTimestamp.Timestamp() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 0)) = int8(int32(2)) + *(*int64)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 8)) = (payload).Seconds + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 16)) = int32((payload).Nanoseconds) + + default: + panic("unreachable") + } + + switch dataModificationTimestamp.Tag() { + case NewTimestampNoChange: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (32+2*4))), 0)) = int8(int32(0)) + + case NewTimestampNow: + + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (32+2*4))), 0)) = int8(int32(1)) + + case NewTimestampTimestamp: + payload := dataModificationTimestamp.Timestamp() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (32+2*4))), 0)) = int8(int32(2)) + *(*int64)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (32+2*4))), 8)) = (payload).Seconds + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (32+2*4))), 16)) = int32((payload).Nanoseconds) + + default: + panic("unreachable") + } + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_set_times_at(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.link-at +func wasm_import_method_descriptor_link_at(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) LinkAt(oldPathFlags PathFlags, oldPath string, newDescriptor *Descriptor, newPath string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (8 + 5*4), 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = int8(int32(oldPathFlags)) + utf8 := unsafe.Pointer(unsafe.StringData(oldPath)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 4)) = uint32(uint32(len(oldPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = uint32(uintptr(uintptr(utf8))) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 0)) = (newDescriptor).Handle() + utf80 := unsafe.Pointer(unsafe.StringData(newPath)) + pinner.Pin(utf80) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+3*4))), 4)) = uint32(uint32(len(newPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+3*4))), 0)) = uint32(uintptr(uintptr(utf80))) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_link_at(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.open-at +func wasm_import_method_descriptor_open_at(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) OpenAt(pathFlags PathFlags, path string, openFlags OpenFlags, flags DescriptorFlags) witTypes.Result[*Descriptor, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (8 + 3*4), 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = int8(int32(pathFlags)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 4)) = uint32(uint32(len(path))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 8)), 0)) = uint32(uintptr(uintptr(utf8))) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (8+2*4))), 0)) = int8(int32(openFlags)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (9+2*4))), 0)) = int8(int32(flags)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_open_at(uintptr(params), returnArea))) + var result witTypes.Result[*Descriptor, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[*Descriptor, ErrorCode](DescriptorFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[*Descriptor, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.readlink-at +func wasm_import_method_descriptor_readlink_at(arg0 int32, arg1 uintptr, arg2 uint32, arg3 uintptr) int32 + +func (self *Descriptor) ReadlinkAt(path string) witTypes.Result[string, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_readlink_at((self).Handle(), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[string, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) + + result = witTypes.Ok[string, ErrorCode](value) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[string, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.remove-directory-at +func wasm_import_method_descriptor_remove_directory_at(arg0 int32, arg1 uintptr, arg2 uint32, arg3 uintptr) int32 + +func (self *Descriptor) RemoveDirectoryAt(path string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_remove_directory_at((self).Handle(), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.rename-at +func wasm_import_method_descriptor_rename_at(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) RenameAt(oldPath string, newDescriptor *Descriptor, newPath string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (6 * 4), 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + utf8 := unsafe.Pointer(unsafe.StringData(oldPath)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 4)) = uint32(uint32(len(oldPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = uint32(uintptr(uintptr(utf8))) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 0)) = (newDescriptor).Handle() + utf80 := unsafe.Pointer(unsafe.StringData(newPath)) + pinner.Pin(utf80) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (4*4))), 4)) = uint32(uint32(len(newPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (4*4))), 0)) = uint32(uintptr(uintptr(utf80))) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_rename_at(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.symlink-at +func wasm_import_method_descriptor_symlink_at(arg0 uintptr, arg1 uintptr) int32 + +func (self *Descriptor) SymlinkAt(oldPath string, newPath string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (5 * 4), 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + utf8 := unsafe.Pointer(unsafe.StringData(oldPath)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 4)) = uint32(uint32(len(oldPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = uint32(uintptr(uintptr(utf8))) + utf80 := unsafe.Pointer(unsafe.StringData(newPath)) + pinner.Pin(utf80) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 4)) = uint32(uint32(len(newPath))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 0)) = uint32(uintptr(uintptr(utf80))) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_symlink_at(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.unlink-file-at +func wasm_import_method_descriptor_unlink_file_at(arg0 int32, arg1 uintptr, arg2 uint32, arg3 uintptr) int32 + +func (self *Descriptor) UnlinkFileAt(path string) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_unlink_file_at((self).Handle(), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.is-same-object +func wasm_import_method_descriptor_is_same_object(arg0 int32, arg1 int32, arg2 uintptr) int32 + +func (self *Descriptor) IsSameObject(other *Descriptor) bool { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 1, 1)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_is_same_object((self).Handle(), (other).Handle(), returnArea))) + + return (uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) != 0) + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.metadata-hash +func wasm_import_method_descriptor_metadata_hash(arg0 int32, arg1 uintptr) int32 + +func (self *Descriptor) MetadataHash() witTypes.Result[MetadataHashValue, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_metadata_hash((self).Handle(), returnArea))) + var result witTypes.Result[MetadataHashValue, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[MetadataHashValue, ErrorCode](MetadataHashValue{uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8))), uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 16)))}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[MetadataHashValue, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:filesystem/types@0.3.0-rc-2026-03-15 [async-lower][method]descriptor.metadata-hash-at +func wasm_import_method_descriptor_metadata_hash_at(arg0 int32, arg1 int32, arg2 uintptr, arg3 uint32, arg4 uintptr) int32 + +func (self *Descriptor) MetadataHashAt(pathFlags PathFlags, path string) witTypes.Result[MetadataHashValue, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + utf8 := unsafe.Pointer(unsafe.StringData(path)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_method_descriptor_metadata_hash_at((self).Handle(), int32(pathFlags), uintptr(utf8), uint32(len(path)), returnArea))) + var result witTypes.Result[MetadataHashValue, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[MetadataHashValue, ErrorCode](MetadataHashValue{uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8))), uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 16)))}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccess() + + case 1: + + variant = MakeErrorCodeAlready() + + case 2: + + variant = MakeErrorCodeBadDescriptor() + + case 3: + + variant = MakeErrorCodeBusy() + + case 4: + + variant = MakeErrorCodeDeadlock() + + case 5: + + variant = MakeErrorCodeQuota() + + case 6: + + variant = MakeErrorCodeExist() + + case 7: + + variant = MakeErrorCodeFileTooLarge() + + case 8: + + variant = MakeErrorCodeIllegalByteSequence() + + case 9: + + variant = MakeErrorCodeInProgress() + + case 10: + + variant = MakeErrorCodeInterrupted() + + case 11: + + variant = MakeErrorCodeInvalid() + + case 12: + + variant = MakeErrorCodeIo() + + case 13: + + variant = MakeErrorCodeIsDirectory() + + case 14: + + variant = MakeErrorCodeLoop() + + case 15: + + variant = MakeErrorCodeTooManyLinks() + + case 16: + + variant = MakeErrorCodeMessageSize() + + case 17: + + variant = MakeErrorCodeNameTooLong() + + case 18: + + variant = MakeErrorCodeNoDevice() + + case 19: + + variant = MakeErrorCodeNoEntry() + + case 20: + + variant = MakeErrorCodeNoLock() + + case 21: + + variant = MakeErrorCodeInsufficientMemory() + + case 22: + + variant = MakeErrorCodeInsufficientSpace() + + case 23: + + variant = MakeErrorCodeNotDirectory() + + case 24: + + variant = MakeErrorCodeNotEmpty() + + case 25: + + variant = MakeErrorCodeNotRecoverable() + + case 26: + + variant = MakeErrorCodeUnsupported() + + case 27: + + variant = MakeErrorCodeNoTty() + + case 28: + + variant = MakeErrorCodeNoSuchDevice() + + case 29: + + variant = MakeErrorCodeOverflow() + + case 30: + + variant = MakeErrorCodeNotPermitted() + + case 31: + + variant = MakeErrorCodePipe() + + case 32: + + variant = MakeErrorCodeReadOnly() + + case 33: + + variant = MakeErrorCodeInvalidSeek() + + case 34: + + variant = MakeErrorCodeTextFileBusy() + + case 35: + + variant = MakeErrorCodeCrossDevice() + + case 36: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[MetadataHashValue, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_insecure/empty.s b/examples/sdk/pkg/bindings/imports/wasi_random_insecure/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_insecure/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_insecure/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_random_insecure/wit_bindings.go new file mode 100644 index 0000000..903468b --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_insecure/wit_bindings.go @@ -0,0 +1,42 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_random_insecure + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:random/insecure@0.3.0-rc-2026-03-15 get-insecure-random-bytes +func wasm_import_get_insecure_random_bytes(arg0 int64, arg1 uintptr) + +func GetInsecureRandomBytes(maxLen uint64) []uint8 { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (2 * 4), 4)) + wasm_import_get_insecure_random_bytes(int64(maxLen), returnArea) + value := unsafe.Slice((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) + result := value + return result + +} + +//go:wasmimport wasi:random/insecure@0.3.0-rc-2026-03-15 get-insecure-random-u64 +func wasm_import_get_insecure_random_u64() int64 + +func GetInsecureRandomU64() uint64 { + + result := wasm_import_get_insecure_random_u64() + return uint64(result) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/empty.s b/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/wit_bindings.go new file mode 100644 index 0000000..1135d10 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_insecure_seed/wit_bindings.go @@ -0,0 +1,33 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_random_insecure_seed + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:random/insecure-seed@0.3.0-rc-2026-03-15 get-insecure-seed +func wasm_import_get_insecure_seed(arg0 uintptr) + +func GetInsecureSeed() (uint64, uint64) { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 16, 8)) + wasm_import_get_insecure_seed(returnArea) + result := witTypes.Tuple2[uint64, uint64]{uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 0))), uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))} + tuple := result + return tuple.F0, tuple.F1 + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_random/empty.s b/examples/sdk/pkg/bindings/imports/wasi_random_random/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_random/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_random_random/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_random_random/wit_bindings.go new file mode 100644 index 0000000..269abaf --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_random_random/wit_bindings.go @@ -0,0 +1,42 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_random_random + +import ( + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:random/random@0.3.0-rc-2026-03-15 get-random-bytes +func wasm_import_get_random_bytes(arg0 int64, arg1 uintptr) + +func GetRandomBytes(maxLen uint64) []uint8 { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (2 * 4), 4)) + wasm_import_get_random_bytes(int64(maxLen), returnArea) + value := unsafe.Slice((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) + result := value + return result + +} + +//go:wasmimport wasi:random/random@0.3.0-rc-2026-03-15 get-random-u64 +func wasm_import_get_random_u64() int64 + +func GetRandomU64() uint64 { + + result := wasm_import_get_random_u64() + return uint64(result) + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/empty.s b/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/wit_bindings.go new file mode 100644 index 0000000..f974635 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_sockets_ip_name_lookup/wit_bindings.go @@ -0,0 +1,173 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_sockets_ip_name_lookup + +import ( + witAsync "go.bytecodealliance.org/pkg/wit/async" + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "pkg/bindings/imports/wasi_sockets_types" + "runtime" + "unsafe" +) + +type IpAddress = wasi_sockets_types.IpAddress + +const ( + // Access denied. + // + // POSIX equivalent: EACCES, EPERM + ErrorCodeAccessDenied uint8 = 0 + // `name` is a syntactically invalid domain name or IP address. + // + // POSIX equivalent: EINVAL + ErrorCodeInvalidArgument uint8 = 1 + // Name does not exist or has no suitable associated IP addresses. + // + // POSIX equivalent: EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY + ErrorCodeNameUnresolvable uint8 = 2 + // A temporary failure in name resolution occurred. + // + // POSIX equivalent: EAI_AGAIN + ErrorCodeTemporaryResolverFailure uint8 = 3 + // A permanent failure in name resolution occurred. + // + // POSIX equivalent: EAI_FAIL + ErrorCodePermanentResolverFailure uint8 = 4 + // A catch-all for errors not captured by the existing variants. + // Implementations can use this to extend the error type without + // breaking existing code. + ErrorCodeOther uint8 = 5 +) + +// Lookup error codes. +type ErrorCode struct { + tag uint8 + value any +} + +func (self ErrorCode) Tag() uint8 { + return self.tag +} + +func (self ErrorCode) Other() witTypes.Option[string] { + if self.tag != ErrorCodeOther { + panic("tag mismatch") + } + return self.value.(witTypes.Option[string]) +} + +func MakeErrorCodeAccessDenied() ErrorCode { + return ErrorCode{ErrorCodeAccessDenied, nil} +} +func MakeErrorCodeInvalidArgument() ErrorCode { + return ErrorCode{ErrorCodeInvalidArgument, nil} +} +func MakeErrorCodeNameUnresolvable() ErrorCode { + return ErrorCode{ErrorCodeNameUnresolvable, nil} +} +func MakeErrorCodeTemporaryResolverFailure() ErrorCode { + return ErrorCode{ErrorCodeTemporaryResolverFailure, nil} +} +func MakeErrorCodePermanentResolverFailure() ErrorCode { + return ErrorCode{ErrorCodePermanentResolverFailure, nil} +} +func MakeErrorCodeOther(value witTypes.Option[string]) ErrorCode { + return ErrorCode{ErrorCodeOther, value} +} + +//go:wasmimport wasi:sockets/ip-name-lookup@0.3.0-rc-2026-03-15 [async-lower]resolve-addresses +func wasm_import_resolve_addresses(arg0 uintptr, arg1 uint32, arg2 uintptr) int32 + +func ResolveAddresses(name string) witTypes.Result[[]wasi_sockets_types.IpAddress, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + utf8 := unsafe.Pointer(unsafe.StringData(name)) + pinner.Pin(utf8) + + witAsync.SubtaskWait(uint32(wasm_import_resolve_addresses(uintptr(utf8), uint32(len(name)), returnArea))) + var result1 witTypes.Result[[]wasi_sockets_types.IpAddress, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + result := make([]wasi_sockets_types.IpAddress, 0, *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) + for index := 0; index < int(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))); index++ { + base := unsafe.Add(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))), index*18) + var variant wasi_sockets_types.IpAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 0))) { + case 0: + + variant = wasi_sockets_types.MakeIpAddressIpv4(witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 2)))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 3)))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 4)))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 5))))}) + + case 1: + + variant = wasi_sockets_types.MakeIpAddressIpv6(witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 2)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 4)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 6)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 8)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 10)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 12)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 14)))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(base), 16))))}) + + default: + panic("unreachable") + } + + result = append(result, variant) + } + + result1 = witTypes.Ok[[]wasi_sockets_types.IpAddress, ErrorCode](result) + case 1: + var variant0 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant0 = MakeErrorCodeAccessDenied() + + case 1: + + variant0 = MakeErrorCodeInvalidArgument() + + case 2: + + variant0 = MakeErrorCodeNameUnresolvable() + + case 3: + + variant0 = MakeErrorCodeTemporaryResolverFailure() + + case 4: + + variant0 = MakeErrorCodePermanentResolverFailure() + + case 5: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant0 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result1 = witTypes.Err[[]wasi_sockets_types.IpAddress, ErrorCode](variant0) + default: + panic("unreachable") + } + + return result1 + +} diff --git a/examples/sdk/pkg/bindings/imports/wasi_sockets_types/empty.s b/examples/sdk/pkg/bindings/imports/wasi_sockets_types/empty.s new file mode 100644 index 0000000..308ab60 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_sockets_types/empty.s @@ -0,0 +1,3 @@ +// This file exists for testing this package without WebAssembly, +// allowing empty function bodies with a //go:wasmimport directive. +// See https://pkg.go.dev/cmd/compile for more information. \ No newline at end of file diff --git a/examples/sdk/pkg/bindings/imports/wasi_sockets_types/wit_bindings.go b/examples/sdk/pkg/bindings/imports/wasi_sockets_types/wit_bindings.go new file mode 100644 index 0000000..9b8c6e5 --- /dev/null +++ b/examples/sdk/pkg/bindings/imports/wasi_sockets_types/wit_bindings.go @@ -0,0 +1,4630 @@ +// Generated by `wit-bindgen` 0.54.0. DO NOT EDIT! +// +// This code was generated from the following packages: +// wasi:clocks@0.3.0-rc-2026-03-15 +// wasi:filesystem@0.3.0-rc-2026-03-15 +// wasi:sockets@0.3.0-rc-2026-03-15 +// wasi:random@0.3.0-rc-2026-03-15 +// wasi:cli@0.3.0-rc-2026-03-15 +// example:sdk + +package wasi_sockets_types + +import ( + witAsync "go.bytecodealliance.org/pkg/wit/async" + witRuntime "go.bytecodealliance.org/pkg/wit/runtime" + witTypes "go.bytecodealliance.org/pkg/wit/types" + "runtime" + "unsafe" +) + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-new-0][method]tcp-socket.listen +func wasm_stream_new_tcp_socket() uint64 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][stream-read-0][method]tcp-socket.listen +func wasm_stream_read_tcp_socket(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][stream-write-0][method]tcp-socket.listen +func wasm_stream_write_tcp_socket(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-drop-readable-0][method]tcp-socket.listen +func wasm_stream_drop_readable_tcp_socket(handle int32) + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-drop-writable-0][method]tcp-socket.listen +func wasm_stream_drop_writable_tcp_socket(handle int32) + +func wasm_stream_lift_tcp_socket(src unsafe.Pointer) *TcpSocket { + + return TcpSocketFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(src), 0))))) +} + +func wasm_stream_lower_tcp_socket( + pinner *runtime.Pinner, + value *TcpSocket, + dst unsafe.Pointer, +) func() { + lifters := make([]func(), 0, 1) + resource := value + handle := resource.TakeHandle() + lifters = append(lifters, func() { + resource.SetHandle(handle) + }) + *(*int32)(unsafe.Add(unsafe.Pointer(dst), 0)) = handle + + return func() { + for _, lifter := range lifters { + lifter() + } + } +} + +var wasm_stream_vtable_tcp_socket = witTypes.StreamVtable[*TcpSocket]{ + 4, + 4, + wasm_stream_read_tcp_socket, + wasm_stream_write_tcp_socket, + nil, + nil, + wasm_stream_drop_readable_tcp_socket, + wasm_stream_drop_writable_tcp_socket, + wasm_stream_lift_tcp_socket, + wasm_stream_lower_tcp_socket, +} + +func MakeStreamTcpSocket() (*witTypes.StreamWriter[*TcpSocket], *witTypes.StreamReader[*TcpSocket]) { + pair := wasm_stream_new_tcp_socket() + return witTypes.MakeStreamWriter[*TcpSocket](&wasm_stream_vtable_tcp_socket, int32(pair>>32)), + witTypes.MakeStreamReader[*TcpSocket](&wasm_stream_vtable_tcp_socket, int32(pair&0xFFFFFFFF)) +} + +func LiftStreamTcpSocket(handle int32) *witTypes.StreamReader[*TcpSocket] { + return witTypes.MakeStreamReader[*TcpSocket](&wasm_stream_vtable_tcp_socket, handle) +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-new-0][method]tcp-socket.send +func wasm_stream_new_u8() uint64 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][stream-read-0][method]tcp-socket.send +func wasm_stream_read_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][stream-write-0][method]tcp-socket.send +func wasm_stream_write_u8(handle int32, item unsafe.Pointer, count uint32) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-drop-readable-0][method]tcp-socket.send +func wasm_stream_drop_readable_u8(handle int32) + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [stream-drop-writable-0][method]tcp-socket.send +func wasm_stream_drop_writable_u8(handle int32) + +var wasm_stream_vtable_u8 = witTypes.StreamVtable[uint8]{ + 1, + 1, + wasm_stream_read_u8, + wasm_stream_write_u8, + nil, + nil, + wasm_stream_drop_readable_u8, + wasm_stream_drop_writable_u8, + nil, + nil, +} + +func MakeStreamU8() (*witTypes.StreamWriter[uint8], *witTypes.StreamReader[uint8]) { + pair := wasm_stream_new_u8() + return witTypes.MakeStreamWriter[uint8](&wasm_stream_vtable_u8, int32(pair>>32)), + witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, int32(pair&0xFFFFFFFF)) +} + +func LiftStreamU8(handle int32) *witTypes.StreamReader[uint8] { + return witTypes.MakeStreamReader[uint8](&wasm_stream_vtable_u8, handle) +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [future-new-1][method]tcp-socket.send +func wasm_future_new_result_unit_error_code() uint64 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][future-read-1][method]tcp-socket.send +func wasm_future_read_result_unit_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][future-write-1][method]tcp-socket.send +func wasm_future_write_result_unit_error_code(handle int32, item unsafe.Pointer) uint32 + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [future-drop-readable-1][method]tcp-socket.send +func wasm_future_drop_readable_result_unit_error_code(handle int32) + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [future-drop-writable-1][method]tcp-socket.send +func wasm_future_drop_writable_result_unit_error_code(handle int32) + +func wasm_future_lift_result_unit_error_code(src unsafe.Pointer) witTypes.Result[witTypes.Unit, ErrorCode] { + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(src), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(src), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result +} + +func wasm_future_lower_result_unit_error_code( + pinner *runtime.Pinner, + value witTypes.Result[witTypes.Unit, ErrorCode], + dst unsafe.Pointer, +) func() { + + switch value.Tag() { + case witTypes.ResultOk: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(0)) + + case witTypes.ResultErr: + payload := value.Err() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 0)) = int8(int32(1)) + + switch payload.Tag() { + case ErrorCodeAccessDenied: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(0)) + + case ErrorCodeNotSupported: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(1)) + + case ErrorCodeInvalidArgument: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(2)) + + case ErrorCodeOutOfMemory: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(3)) + + case ErrorCodeTimeout: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(4)) + + case ErrorCodeInvalidState: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(5)) + + case ErrorCodeAddressNotBindable: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(6)) + + case ErrorCodeAddressInUse: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(7)) + + case ErrorCodeRemoteUnreachable: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(8)) + + case ErrorCodeConnectionRefused: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(9)) + + case ErrorCodeConnectionBroken: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(10)) + + case ErrorCodeConnectionReset: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(11)) + + case ErrorCodeConnectionAborted: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(12)) + + case ErrorCodeDatagramTooLarge: + + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(13)) + + case ErrorCodeOther: + payload := payload.Other() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), 4)) = int8(int32(14)) + + switch payload.Tag() { + case witTypes.OptionNone: + *(*int8)(unsafe.Add(unsafe.Pointer(dst), (2 * 4))) = int8(int32(0)) + + case witTypes.OptionSome: + payload := payload.Some() + *(*int8)(unsafe.Add(unsafe.Pointer(dst), (2 * 4))) = int8(int32(1)) + utf8 := unsafe.Pointer(unsafe.StringData(payload)) + pinner.Pin(utf8) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (4 * 4))) = uint32(uint32(len(payload))) + *(*uint32)(unsafe.Add(unsafe.Pointer(dst), (3 * 4))) = uint32(uintptr(uintptr(utf8))) + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + + return func() {} +} + +var wasm_future_vtable_result_unit_error_code = witTypes.FutureVtable[witTypes.Result[witTypes.Unit, ErrorCode]]{ + (5 * 4), + 4, + wasm_future_read_result_unit_error_code, + wasm_future_write_result_unit_error_code, + nil, + nil, + wasm_future_drop_readable_result_unit_error_code, + wasm_future_drop_writable_result_unit_error_code, + wasm_future_lift_result_unit_error_code, + wasm_future_lower_result_unit_error_code, +} + +func MakeFutureResultUnitErrorCode() (*witTypes.FutureWriter[witTypes.Result[witTypes.Unit, ErrorCode]], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]) { + pair := wasm_future_new_result_unit_error_code() + return witTypes.MakeFutureWriter[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, int32(pair>>32)), + witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, int32(pair&0xFFFFFFFF)) +} + +func LiftFutureResultUnitErrorCode(handle int32) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]] { + return witTypes.MakeFutureReader[witTypes.Result[witTypes.Unit, ErrorCode]](&wasm_future_vtable_result_unit_error_code, handle) +} + +type Duration = uint64 + +const ( + // Access denied. + // + // POSIX equivalent: EACCES, EPERM + ErrorCodeAccessDenied uint8 = 0 + // The operation is not supported. + // + // POSIX equivalent: EOPNOTSUPP, ENOPROTOOPT, EPFNOSUPPORT, EPROTONOSUPPORT, ESOCKTNOSUPPORT + ErrorCodeNotSupported uint8 = 1 + // One of the arguments is invalid. + // + // POSIX equivalent: EINVAL, EDESTADDRREQ, EAFNOSUPPORT + ErrorCodeInvalidArgument uint8 = 2 + // Not enough memory to complete the operation. + // + // POSIX equivalent: ENOMEM, ENOBUFS + ErrorCodeOutOfMemory uint8 = 3 + // The operation timed out before it could finish completely. + // + // POSIX equivalent: ETIMEDOUT + ErrorCodeTimeout uint8 = 4 + // The operation is not valid in the socket's current state. + ErrorCodeInvalidState uint8 = 5 + // The local address is not available. + // + // POSIX equivalent: EADDRNOTAVAIL + ErrorCodeAddressNotBindable uint8 = 6 + // A bind operation failed because the provided address is already in + // use or because there are no ephemeral ports available. + // + // POSIX equivalent: EADDRINUSE + ErrorCodeAddressInUse uint8 = 7 + // The remote address is not reachable. + // + // POSIX equivalent: EHOSTUNREACH, EHOSTDOWN, ENETDOWN, ENETUNREACH, ENONET + ErrorCodeRemoteUnreachable uint8 = 8 + // The connection was forcefully rejected. + // + // POSIX equivalent: ECONNREFUSED + ErrorCodeConnectionRefused uint8 = 9 + // A write failed because the connection was broken. + // + // POSIX equivalent: EPIPE + ErrorCodeConnectionBroken uint8 = 10 + // The connection was reset. + // + // POSIX equivalent: ECONNRESET + ErrorCodeConnectionReset uint8 = 11 + // The connection was aborted. + // + // POSIX equivalent: ECONNABORTED + ErrorCodeConnectionAborted uint8 = 12 + // The size of a datagram sent to a UDP socket exceeded the maximum + // supported size. + // + // POSIX equivalent: EMSGSIZE + ErrorCodeDatagramTooLarge uint8 = 13 + // A catch-all for errors not captured by the existing variants. + // Implementations can use this to extend the error type without + // breaking existing code. + ErrorCodeOther uint8 = 14 +) + +// Error codes. +// +// In theory, every API can return any error code. +// In practice, API's typically only return the errors documented per API +// combined with a couple of errors that are always possible: +// - `other` +// - `access-denied` +// - `not-supported` +// - `out-of-memory` +// +// See each individual API for what the POSIX equivalents are. They sometimes differ per API. +type ErrorCode struct { + tag uint8 + value any +} + +func (self ErrorCode) Tag() uint8 { + return self.tag +} + +func (self ErrorCode) Other() witTypes.Option[string] { + if self.tag != ErrorCodeOther { + panic("tag mismatch") + } + return self.value.(witTypes.Option[string]) +} + +func MakeErrorCodeAccessDenied() ErrorCode { + return ErrorCode{ErrorCodeAccessDenied, nil} +} +func MakeErrorCodeNotSupported() ErrorCode { + return ErrorCode{ErrorCodeNotSupported, nil} +} +func MakeErrorCodeInvalidArgument() ErrorCode { + return ErrorCode{ErrorCodeInvalidArgument, nil} +} +func MakeErrorCodeOutOfMemory() ErrorCode { + return ErrorCode{ErrorCodeOutOfMemory, nil} +} +func MakeErrorCodeTimeout() ErrorCode { + return ErrorCode{ErrorCodeTimeout, nil} +} +func MakeErrorCodeInvalidState() ErrorCode { + return ErrorCode{ErrorCodeInvalidState, nil} +} +func MakeErrorCodeAddressNotBindable() ErrorCode { + return ErrorCode{ErrorCodeAddressNotBindable, nil} +} +func MakeErrorCodeAddressInUse() ErrorCode { + return ErrorCode{ErrorCodeAddressInUse, nil} +} +func MakeErrorCodeRemoteUnreachable() ErrorCode { + return ErrorCode{ErrorCodeRemoteUnreachable, nil} +} +func MakeErrorCodeConnectionRefused() ErrorCode { + return ErrorCode{ErrorCodeConnectionRefused, nil} +} +func MakeErrorCodeConnectionBroken() ErrorCode { + return ErrorCode{ErrorCodeConnectionBroken, nil} +} +func MakeErrorCodeConnectionReset() ErrorCode { + return ErrorCode{ErrorCodeConnectionReset, nil} +} +func MakeErrorCodeConnectionAborted() ErrorCode { + return ErrorCode{ErrorCodeConnectionAborted, nil} +} +func MakeErrorCodeDatagramTooLarge() ErrorCode { + return ErrorCode{ErrorCodeDatagramTooLarge, nil} +} +func MakeErrorCodeOther(value witTypes.Option[string]) ErrorCode { + return ErrorCode{ErrorCodeOther, value} +} + +const ( + // Similar to `AF_INET` in POSIX. + IpAddressFamilyIpv4 uint8 = 0 + // Similar to `AF_INET6` in POSIX. + IpAddressFamilyIpv6 uint8 = 1 +) + +type IpAddressFamily = uint8 +type Ipv4Address = witTypes.Tuple4[uint8, uint8, uint8, uint8] +type Ipv6Address = witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16] + +const ( + IpAddressIpv4 uint8 = 0 + IpAddressIpv6 uint8 = 1 +) + +type IpAddress struct { + tag uint8 + value any +} + +func (self IpAddress) Tag() uint8 { + return self.tag +} + +func (self IpAddress) Ipv4() witTypes.Tuple4[uint8, uint8, uint8, uint8] { + if self.tag != IpAddressIpv4 { + panic("tag mismatch") + } + return self.value.(witTypes.Tuple4[uint8, uint8, uint8, uint8]) +} +func (self IpAddress) Ipv6() witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16] { + if self.tag != IpAddressIpv6 { + panic("tag mismatch") + } + return self.value.(witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]) +} + +func MakeIpAddressIpv4(value witTypes.Tuple4[uint8, uint8, uint8, uint8]) IpAddress { + return IpAddress{IpAddressIpv4, value} +} +func MakeIpAddressIpv6(value witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]) IpAddress { + return IpAddress{IpAddressIpv6, value} +} + +type Ipv4SocketAddress struct { + // sin_port + Port uint16 + // sin_addr + Address witTypes.Tuple4[uint8, uint8, uint8, uint8] +} + +type Ipv6SocketAddress struct { + // sin6_port + Port uint16 + // sin6_flowinfo + FlowInfo uint32 + // sin6_addr + Address witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16] + // sin6_scope_id + ScopeId uint32 +} + +const ( + IpSocketAddressIpv4 uint8 = 0 + IpSocketAddressIpv6 uint8 = 1 +) + +type IpSocketAddress struct { + tag uint8 + value any +} + +func (self IpSocketAddress) Tag() uint8 { + return self.tag +} + +func (self IpSocketAddress) Ipv4() Ipv4SocketAddress { + if self.tag != IpSocketAddressIpv4 { + panic("tag mismatch") + } + return self.value.(Ipv4SocketAddress) +} +func (self IpSocketAddress) Ipv6() Ipv6SocketAddress { + if self.tag != IpSocketAddressIpv6 { + panic("tag mismatch") + } + return self.value.(Ipv6SocketAddress) +} + +func MakeIpSocketAddressIpv4(value Ipv4SocketAddress) IpSocketAddress { + return IpSocketAddress{IpSocketAddressIpv4, value} +} +func MakeIpSocketAddressIpv6(value Ipv6SocketAddress) IpSocketAddress { + return IpSocketAddress{IpSocketAddressIpv6, value} +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [resource-drop]tcp-socket +func resourceDropTcpSocket(handle int32) + +// A TCP socket resource. +// +// The socket can be in one of the following states: +// - `unbound` +// - `bound` (See note below) +// - `listening` +// - `connecting` +// - `connected` +// - `closed` +// See +// for more information. +// +// Note: Except where explicitly mentioned, whenever this documentation uses +// the term "bound" without backticks it actually means: in the `bound` state *or higher*. +// (i.e. `bound`, `listening`, `connecting` or `connected`) +// +// WASI uses shared ownership semantics: the `tcp-socket` handle and all +// derived `stream` and `future` values reference a single underlying OS +// socket: +// - Send/receive streams remain functional after the original `tcp-socket` +// handle is dropped. +// - The stream returned by `listen` behaves similarly. +// - Client sockets returned by `tcp-socket::listen` are independent and do +// not keep the listening socket alive. +// +// The OS socket is closed only after the last handle is dropped. This +// model has observable effects; for example, it affects when the local +// port binding is released. +// +// In addition to the general error codes documented on the +// `types::error-code` type, TCP socket methods may always return +// `error(invalid-state)` when in the `closed` state. +type TcpSocket struct { + handle *witRuntime.Handle +} + +func (self *TcpSocket) TakeHandle() int32 { + return self.handle.Take() +} + +func (self *TcpSocket) SetHandle(handle int32) { + self.handle.Set(handle) +} + +func (self *TcpSocket) Handle() int32 { + return self.handle.Use() +} + +func (self *TcpSocket) Drop() { + handle := self.handle.TakeOrNil() + if handle != 0 { + resourceDropTcpSocket(handle) + } +} + +func TcpSocketFromOwnHandle(handleValue int32) *TcpSocket { + handle := witRuntime.MakeHandle(handleValue) + value := &TcpSocket{handle} + runtime.AddCleanup(value, func(_ int) { + handleValue := handle.TakeOrNil() + if handleValue != 0 { + resourceDropTcpSocket(handleValue) + } + }, 0) + return value +} + +func TcpSocketFromBorrowHandle(handleValue int32) *TcpSocket { + handle := witRuntime.MakeHandle(handleValue) + return &TcpSocket{handle} +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [resource-drop]udp-socket +func resourceDropUdpSocket(handle int32) + +// A UDP socket handle. +type UdpSocket struct { + handle *witRuntime.Handle +} + +func (self *UdpSocket) TakeHandle() int32 { + return self.handle.Take() +} + +func (self *UdpSocket) SetHandle(handle int32) { + self.handle.Set(handle) +} + +func (self *UdpSocket) Handle() int32 { + return self.handle.Use() +} + +func (self *UdpSocket) Drop() { + handle := self.handle.TakeOrNil() + if handle != 0 { + resourceDropUdpSocket(handle) + } +} + +func UdpSocketFromOwnHandle(handleValue int32) *UdpSocket { + handle := witRuntime.MakeHandle(handleValue) + value := &UdpSocket{handle} + runtime.AddCleanup(value, func(_ int) { + handleValue := handle.TakeOrNil() + if handleValue != 0 { + resourceDropUdpSocket(handleValue) + } + }, 0) + return value +} + +func UdpSocketFromBorrowHandle(handleValue int32) *UdpSocket { + handle := witRuntime.MakeHandle(handleValue) + return &UdpSocket{handle} +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [static]tcp-socket.create +func wasm_import_static_tcp_socket_create(arg0 int32, arg1 uintptr) + +func TcpSocketCreate(addressFamily IpAddressFamily) witTypes.Result[*TcpSocket, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_static_tcp_socket_create(int32(addressFamily), returnArea) + var result witTypes.Result[*TcpSocket, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[*TcpSocket, ErrorCode](TcpSocketFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[*TcpSocket, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.bind +func wasm_import_method_tcp_socket_bind(arg0 int32, arg1 int32, arg2 int32, arg3 int32, arg4 int32, arg5 int32, arg6 int32, arg7 int32, arg8 int32, arg9 int32, arg10 int32, arg11 int32, arg12 int32, arg13 uintptr) + +func (self *TcpSocket) Bind(localAddress IpSocketAddress) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + var variant int32 + var variant0 int32 + var variant1 int32 + var variant2 int32 + var variant3 int32 + var variant4 int32 + var variant5 int32 + var variant6 int32 + var variant7 int32 + var variant8 int32 + var variant9 int32 + var variant10 int32 + switch localAddress.Tag() { + case IpSocketAddressIpv4: + payload := localAddress.Ipv4() + + variant = int32(0) + variant0 = int32((payload).Port) + variant1 = int32(((payload).Address).F0) + variant2 = int32(((payload).Address).F1) + variant3 = int32(((payload).Address).F2) + variant4 = int32(((payload).Address).F3) + variant5 = 0 + variant6 = 0 + variant7 = 0 + variant8 = 0 + variant9 = 0 + variant10 = 0 + + case IpSocketAddressIpv6: + payload := localAddress.Ipv6() + + variant = int32(1) + variant0 = int32((payload).Port) + variant1 = int32((payload).FlowInfo) + variant2 = int32(((payload).Address).F0) + variant3 = int32(((payload).Address).F1) + variant4 = int32(((payload).Address).F2) + variant5 = int32(((payload).Address).F3) + variant6 = int32(((payload).Address).F4) + variant7 = int32(((payload).Address).F5) + variant8 = int32(((payload).Address).F6) + variant9 = int32(((payload).Address).F7) + variant10 = int32((payload).ScopeId) + + default: + panic("unreachable") + } + wasm_import_method_tcp_socket_bind((self).Handle(), variant, variant0, variant1, variant2, variant3, variant4, variant5, variant6, variant7, variant8, variant9, variant10, returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant11 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant11 = MakeErrorCodeAccessDenied() + + case 1: + + variant11 = MakeErrorCodeNotSupported() + + case 2: + + variant11 = MakeErrorCodeInvalidArgument() + + case 3: + + variant11 = MakeErrorCodeOutOfMemory() + + case 4: + + variant11 = MakeErrorCodeTimeout() + + case 5: + + variant11 = MakeErrorCodeInvalidState() + + case 6: + + variant11 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant11 = MakeErrorCodeAddressInUse() + + case 8: + + variant11 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant11 = MakeErrorCodeConnectionRefused() + + case 10: + + variant11 = MakeErrorCodeConnectionBroken() + + case 11: + + variant11 = MakeErrorCodeConnectionReset() + + case 12: + + variant11 = MakeErrorCodeConnectionAborted() + + case 13: + + variant11 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant11 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant11) + default: + panic("unreachable") + } + result12 := result + return result12 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][method]tcp-socket.connect +func wasm_import_method_tcp_socket_connect(arg0 uintptr, arg1 uintptr) int32 + +func (self *TcpSocket) Connect(remoteAddress IpSocketAddress) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, 36, 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + + switch remoteAddress.Tag() { + case IpSocketAddressIpv4: + payload := remoteAddress.Ipv4() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = int8(int32(0)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 4)) = int16(int32((payload).Port)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 6)) = int8(int32(((payload).Address).F0)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 7)) = int8(int32(((payload).Address).F1)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 8)) = int8(int32(((payload).Address).F2)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 9)) = int8(int32(((payload).Address).F3)) + + case IpSocketAddressIpv6: + payload := remoteAddress.Ipv6() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = int8(int32(1)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 4)) = int16(int32((payload).Port)) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 8)) = int32((payload).FlowInfo) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 12)) = int16(int32(((payload).Address).F0)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 14)) = int16(int32(((payload).Address).F1)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 16)) = int16(int32(((payload).Address).F2)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 18)) = int16(int32(((payload).Address).F3)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 20)) = int16(int32(((payload).Address).F4)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 22)) = int16(int32(((payload).Address).F5)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 24)) = int16(int32(((payload).Address).F6)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 26)) = int16(int32(((payload).Address).F7)) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 28)) = int32((payload).ScopeId) + + default: + panic("unreachable") + } + + witAsync.SubtaskWait(uint32(wasm_import_method_tcp_socket_connect(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.listen +func wasm_import_method_tcp_socket_listen(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) Listen() witTypes.Result[*witTypes.StreamReader[*TcpSocket], ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_listen((self).Handle(), returnArea) + var result witTypes.Result[*witTypes.StreamReader[*TcpSocket], ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[*witTypes.StreamReader[*TcpSocket], ErrorCode](LiftStreamTcpSocket(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[*witTypes.StreamReader[*TcpSocket], ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.send +func wasm_import_method_tcp_socket_send(arg0 int32, arg1 int32) int32 + +func (self *TcpSocket) Send(data *witTypes.StreamReader[uint8]) *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]] { + + result := wasm_import_method_tcp_socket_send((self).Handle(), (data).TakeHandle()) + return LiftFutureResultUnitErrorCode(result) + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.receive +func wasm_import_method_tcp_socket_receive(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) Receive() (*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]) { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, 8, 4)) + wasm_import_method_tcp_socket_receive((self).Handle(), returnArea) + result := witTypes.Tuple2[*witTypes.StreamReader[uint8], *witTypes.FutureReader[witTypes.Result[witTypes.Unit, ErrorCode]]]{LiftStreamU8(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 0))), LiftFutureResultUnitErrorCode(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))} + tuple := result + return tuple.F0, tuple.F1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-local-address +func wasm_import_method_tcp_socket_get_local_address(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetLocalAddress() witTypes.Result[IpSocketAddress, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (32 + 1*4), 4)) + wasm_import_method_tcp_socket_get_local_address((self).Handle(), returnArea) + var result witTypes.Result[IpSocketAddress, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant IpSocketAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeIpSocketAddressIpv4(Ipv4SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (6 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (7 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (9 + 1*4)))))}}) + + case 1: + + variant = MakeIpSocketAddressIpv6(Ipv6SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))), witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (12 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (14 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (18 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (20 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (22 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (26 + 1*4)))))}, uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (28 + 1*4))))}) + + default: + panic("unreachable") + } + + result = witTypes.Ok[IpSocketAddress, ErrorCode](variant) + case 1: + var variant0 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant0 = MakeErrorCodeAccessDenied() + + case 1: + + variant0 = MakeErrorCodeNotSupported() + + case 2: + + variant0 = MakeErrorCodeInvalidArgument() + + case 3: + + variant0 = MakeErrorCodeOutOfMemory() + + case 4: + + variant0 = MakeErrorCodeTimeout() + + case 5: + + variant0 = MakeErrorCodeInvalidState() + + case 6: + + variant0 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant0 = MakeErrorCodeAddressInUse() + + case 8: + + variant0 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant0 = MakeErrorCodeConnectionRefused() + + case 10: + + variant0 = MakeErrorCodeConnectionBroken() + + case 11: + + variant0 = MakeErrorCodeConnectionReset() + + case 12: + + variant0 = MakeErrorCodeConnectionAborted() + + case 13: + + variant0 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant0 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[IpSocketAddress, ErrorCode](variant0) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-remote-address +func wasm_import_method_tcp_socket_get_remote_address(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetRemoteAddress() witTypes.Result[IpSocketAddress, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (32 + 1*4), 4)) + wasm_import_method_tcp_socket_get_remote_address((self).Handle(), returnArea) + var result witTypes.Result[IpSocketAddress, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant IpSocketAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeIpSocketAddressIpv4(Ipv4SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (6 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (7 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (9 + 1*4)))))}}) + + case 1: + + variant = MakeIpSocketAddressIpv6(Ipv6SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))), witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (12 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (14 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (18 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (20 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (22 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (26 + 1*4)))))}, uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (28 + 1*4))))}) + + default: + panic("unreachable") + } + + result = witTypes.Ok[IpSocketAddress, ErrorCode](variant) + case 1: + var variant0 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant0 = MakeErrorCodeAccessDenied() + + case 1: + + variant0 = MakeErrorCodeNotSupported() + + case 2: + + variant0 = MakeErrorCodeInvalidArgument() + + case 3: + + variant0 = MakeErrorCodeOutOfMemory() + + case 4: + + variant0 = MakeErrorCodeTimeout() + + case 5: + + variant0 = MakeErrorCodeInvalidState() + + case 6: + + variant0 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant0 = MakeErrorCodeAddressInUse() + + case 8: + + variant0 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant0 = MakeErrorCodeConnectionRefused() + + case 10: + + variant0 = MakeErrorCodeConnectionBroken() + + case 11: + + variant0 = MakeErrorCodeConnectionReset() + + case 12: + + variant0 = MakeErrorCodeConnectionAborted() + + case 13: + + variant0 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant0 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[IpSocketAddress, ErrorCode](variant0) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-is-listening +func wasm_import_method_tcp_socket_get_is_listening(arg0 int32) int32 + +func (self *TcpSocket) GetIsListening() bool { + + result := wasm_import_method_tcp_socket_get_is_listening((self).Handle()) + return (result != 0) + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-address-family +func wasm_import_method_tcp_socket_get_address_family(arg0 int32) int32 + +func (self *TcpSocket) GetAddressFamily() IpAddressFamily { + + result := wasm_import_method_tcp_socket_get_address_family((self).Handle()) + return uint8(result) + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-listen-backlog-size +func wasm_import_method_tcp_socket_set_listen_backlog_size(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *TcpSocket) SetListenBacklogSize(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_listen_backlog_size((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-keep-alive-enabled +func wasm_import_method_tcp_socket_get_keep_alive_enabled(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetKeepAliveEnabled() witTypes.Result[bool, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_get_keep_alive_enabled((self).Handle(), returnArea) + var result witTypes.Result[bool, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[bool, ErrorCode]((uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) != 0)) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[bool, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-keep-alive-enabled +func wasm_import_method_tcp_socket_set_keep_alive_enabled(arg0 int32, arg1 int32, arg2 uintptr) + +func (self *TcpSocket) SetKeepAliveEnabled(value bool) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + var result int32 + if value { + result = 1 + } else { + result = 0 + } + wasm_import_method_tcp_socket_set_keep_alive_enabled((self).Handle(), result, returnArea) + var result1 witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result1 = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result1 = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result2 := result1 + return result2 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-keep-alive-idle-time +func wasm_import_method_tcp_socket_get_keep_alive_idle_time(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetKeepAliveIdleTime() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_tcp_socket_get_keep_alive_idle_time((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-keep-alive-idle-time +func wasm_import_method_tcp_socket_set_keep_alive_idle_time(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *TcpSocket) SetKeepAliveIdleTime(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_keep_alive_idle_time((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-keep-alive-interval +func wasm_import_method_tcp_socket_get_keep_alive_interval(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetKeepAliveInterval() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_tcp_socket_get_keep_alive_interval((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-keep-alive-interval +func wasm_import_method_tcp_socket_set_keep_alive_interval(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *TcpSocket) SetKeepAliveInterval(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_keep_alive_interval((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-keep-alive-count +func wasm_import_method_tcp_socket_get_keep_alive_count(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetKeepAliveCount() witTypes.Result[uint32, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_get_keep_alive_count((self).Handle(), returnArea) + var result witTypes.Result[uint32, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint32, ErrorCode](uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint32, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-keep-alive-count +func wasm_import_method_tcp_socket_set_keep_alive_count(arg0 int32, arg1 int32, arg2 uintptr) + +func (self *TcpSocket) SetKeepAliveCount(value uint32) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_keep_alive_count((self).Handle(), int32(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-hop-limit +func wasm_import_method_tcp_socket_get_hop_limit(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetHopLimit() witTypes.Result[uint8, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_get_hop_limit((self).Handle(), returnArea) + var result witTypes.Result[uint8, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint8, ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint8, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-hop-limit +func wasm_import_method_tcp_socket_set_hop_limit(arg0 int32, arg1 int32, arg2 uintptr) + +func (self *TcpSocket) SetHopLimit(value uint8) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_hop_limit((self).Handle(), int32(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-receive-buffer-size +func wasm_import_method_tcp_socket_get_receive_buffer_size(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetReceiveBufferSize() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_tcp_socket_get_receive_buffer_size((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-receive-buffer-size +func wasm_import_method_tcp_socket_set_receive_buffer_size(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *TcpSocket) SetReceiveBufferSize(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_receive_buffer_size((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.get-send-buffer-size +func wasm_import_method_tcp_socket_get_send_buffer_size(arg0 int32, arg1 uintptr) + +func (self *TcpSocket) GetSendBufferSize() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_tcp_socket_get_send_buffer_size((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]tcp-socket.set-send-buffer-size +func wasm_import_method_tcp_socket_set_send_buffer_size(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *TcpSocket) SetSendBufferSize(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_tcp_socket_set_send_buffer_size((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [static]udp-socket.create +func wasm_import_static_udp_socket_create(arg0 int32, arg1 uintptr) + +func UdpSocketCreate(addressFamily IpAddressFamily) witTypes.Result[*UdpSocket, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_static_udp_socket_create(int32(addressFamily), returnArea) + var result witTypes.Result[*UdpSocket, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[*UdpSocket, ErrorCode](UdpSocketFromOwnHandle(int32(uintptr(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), 4)))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[*UdpSocket, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.bind +func wasm_import_method_udp_socket_bind(arg0 int32, arg1 int32, arg2 int32, arg3 int32, arg4 int32, arg5 int32, arg6 int32, arg7 int32, arg8 int32, arg9 int32, arg10 int32, arg11 int32, arg12 int32, arg13 uintptr) + +func (self *UdpSocket) Bind(localAddress IpSocketAddress) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + var variant int32 + var variant0 int32 + var variant1 int32 + var variant2 int32 + var variant3 int32 + var variant4 int32 + var variant5 int32 + var variant6 int32 + var variant7 int32 + var variant8 int32 + var variant9 int32 + var variant10 int32 + switch localAddress.Tag() { + case IpSocketAddressIpv4: + payload := localAddress.Ipv4() + + variant = int32(0) + variant0 = int32((payload).Port) + variant1 = int32(((payload).Address).F0) + variant2 = int32(((payload).Address).F1) + variant3 = int32(((payload).Address).F2) + variant4 = int32(((payload).Address).F3) + variant5 = 0 + variant6 = 0 + variant7 = 0 + variant8 = 0 + variant9 = 0 + variant10 = 0 + + case IpSocketAddressIpv6: + payload := localAddress.Ipv6() + + variant = int32(1) + variant0 = int32((payload).Port) + variant1 = int32((payload).FlowInfo) + variant2 = int32(((payload).Address).F0) + variant3 = int32(((payload).Address).F1) + variant4 = int32(((payload).Address).F2) + variant5 = int32(((payload).Address).F3) + variant6 = int32(((payload).Address).F4) + variant7 = int32(((payload).Address).F5) + variant8 = int32(((payload).Address).F6) + variant9 = int32(((payload).Address).F7) + variant10 = int32((payload).ScopeId) + + default: + panic("unreachable") + } + wasm_import_method_udp_socket_bind((self).Handle(), variant, variant0, variant1, variant2, variant3, variant4, variant5, variant6, variant7, variant8, variant9, variant10, returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant11 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant11 = MakeErrorCodeAccessDenied() + + case 1: + + variant11 = MakeErrorCodeNotSupported() + + case 2: + + variant11 = MakeErrorCodeInvalidArgument() + + case 3: + + variant11 = MakeErrorCodeOutOfMemory() + + case 4: + + variant11 = MakeErrorCodeTimeout() + + case 5: + + variant11 = MakeErrorCodeInvalidState() + + case 6: + + variant11 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant11 = MakeErrorCodeAddressInUse() + + case 8: + + variant11 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant11 = MakeErrorCodeConnectionRefused() + + case 10: + + variant11 = MakeErrorCodeConnectionBroken() + + case 11: + + variant11 = MakeErrorCodeConnectionReset() + + case 12: + + variant11 = MakeErrorCodeConnectionAborted() + + case 13: + + variant11 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant11 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant11) + default: + panic("unreachable") + } + result12 := result + return result12 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.connect +func wasm_import_method_udp_socket_connect(arg0 int32, arg1 int32, arg2 int32, arg3 int32, arg4 int32, arg5 int32, arg6 int32, arg7 int32, arg8 int32, arg9 int32, arg10 int32, arg11 int32, arg12 int32, arg13 uintptr) + +func (self *UdpSocket) Connect(remoteAddress IpSocketAddress) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + var variant int32 + var variant0 int32 + var variant1 int32 + var variant2 int32 + var variant3 int32 + var variant4 int32 + var variant5 int32 + var variant6 int32 + var variant7 int32 + var variant8 int32 + var variant9 int32 + var variant10 int32 + switch remoteAddress.Tag() { + case IpSocketAddressIpv4: + payload := remoteAddress.Ipv4() + + variant = int32(0) + variant0 = int32((payload).Port) + variant1 = int32(((payload).Address).F0) + variant2 = int32(((payload).Address).F1) + variant3 = int32(((payload).Address).F2) + variant4 = int32(((payload).Address).F3) + variant5 = 0 + variant6 = 0 + variant7 = 0 + variant8 = 0 + variant9 = 0 + variant10 = 0 + + case IpSocketAddressIpv6: + payload := remoteAddress.Ipv6() + + variant = int32(1) + variant0 = int32((payload).Port) + variant1 = int32((payload).FlowInfo) + variant2 = int32(((payload).Address).F0) + variant3 = int32(((payload).Address).F1) + variant4 = int32(((payload).Address).F2) + variant5 = int32(((payload).Address).F3) + variant6 = int32(((payload).Address).F4) + variant7 = int32(((payload).Address).F5) + variant8 = int32(((payload).Address).F6) + variant9 = int32(((payload).Address).F7) + variant10 = int32((payload).ScopeId) + + default: + panic("unreachable") + } + wasm_import_method_udp_socket_connect((self).Handle(), variant, variant0, variant1, variant2, variant3, variant4, variant5, variant6, variant7, variant8, variant9, variant10, returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant11 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant11 = MakeErrorCodeAccessDenied() + + case 1: + + variant11 = MakeErrorCodeNotSupported() + + case 2: + + variant11 = MakeErrorCodeInvalidArgument() + + case 3: + + variant11 = MakeErrorCodeOutOfMemory() + + case 4: + + variant11 = MakeErrorCodeTimeout() + + case 5: + + variant11 = MakeErrorCodeInvalidState() + + case 6: + + variant11 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant11 = MakeErrorCodeAddressInUse() + + case 8: + + variant11 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant11 = MakeErrorCodeConnectionRefused() + + case 10: + + variant11 = MakeErrorCodeConnectionBroken() + + case 11: + + variant11 = MakeErrorCodeConnectionReset() + + case 12: + + variant11 = MakeErrorCodeConnectionAborted() + + case 13: + + variant11 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant11 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant11) + default: + panic("unreachable") + } + result12 := result + return result12 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.disconnect +func wasm_import_method_udp_socket_disconnect(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) Disconnect() witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_udp_socket_disconnect((self).Handle(), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][method]udp-socket.send +func wasm_import_method_udp_socket_send(arg0 uintptr, arg1 uintptr) int32 + +func (self *UdpSocket) Send(data []uint8, remoteAddress witTypes.Option[IpSocketAddress]) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + params := witRuntime.Allocate(pinner, (32 + 4*4), 4) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 0)), 0)) = (self).Handle() + data0 := unsafe.Pointer(unsafe.SliceData(data)) + pinner.Pin(data0) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 4)) = uint32(uint32(len(data))) + *(*uint32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), 4)), 0)) = uint32(uintptr(uintptr(data0))) + + switch remoteAddress.Tag() { + case witTypes.OptionNone: + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 0)) = int8(int32(0)) + + case witTypes.OptionSome: + payload := remoteAddress.Some() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 0)) = int8(int32(1)) + + switch payload.Tag() { + case IpSocketAddressIpv4: + payload := payload.Ipv4() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 4)) = int8(int32(0)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 8)) = int16(int32((payload).Port)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 10)) = int8(int32(((payload).Address).F0)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 11)) = int8(int32(((payload).Address).F1)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 12)) = int8(int32(((payload).Address).F2)) + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 13)) = int8(int32(((payload).Address).F3)) + + case IpSocketAddressIpv6: + payload := payload.Ipv6() + *(*int8)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 4)) = int8(int32(1)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 8)) = int16(int32((payload).Port)) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 12)) = int32((payload).FlowInfo) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 16)) = int16(int32(((payload).Address).F0)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 18)) = int16(int32(((payload).Address).F1)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 20)) = int16(int32(((payload).Address).F2)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 22)) = int16(int32(((payload).Address).F3)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 24)) = int16(int32(((payload).Address).F4)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 26)) = int16(int32(((payload).Address).F5)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 28)) = int16(int32(((payload).Address).F6)) + *(*int16)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 30)) = int16(int32(((payload).Address).F7)) + *(*int32)(unsafe.Add(unsafe.Pointer(unsafe.Add(unsafe.Pointer(params), (3*4))), 32)) = int32((payload).ScopeId) + + default: + panic("unreachable") + } + + default: + panic("unreachable") + } + + witAsync.SubtaskWait(uint32(wasm_import_method_udp_socket_send(uintptr(params), returnArea))) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [async-lower][method]udp-socket.receive +func wasm_import_method_udp_socket_receive(arg0 int32, arg1 uintptr) int32 + +func (self *UdpSocket) Receive() witTypes.Result[witTypes.Tuple2[[]uint8, IpSocketAddress], ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (32 + 3*4), 4)) + + witAsync.SubtaskWait(uint32(wasm_import_method_udp_socket_receive((self).Handle(), returnArea))) + var result witTypes.Result[witTypes.Tuple2[[]uint8, IpSocketAddress], ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + value := unsafe.Slice((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) + var variant IpSocketAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))) { + case 0: + + variant = MakeIpSocketAddressIpv4(Ipv4SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 3*4))))), witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (6 + 3*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (7 + 3*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (9 + 3*4)))))}}) + + case 1: + + variant = MakeIpSocketAddressIpv6(Ipv6SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 3*4))))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))), witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (12 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (14 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (18 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (20 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (22 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 3*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (26 + 3*4)))))}, uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (28 + 3*4))))}) + + default: + panic("unreachable") + } + + result = witTypes.Ok[witTypes.Tuple2[[]uint8, IpSocketAddress], ErrorCode](witTypes.Tuple2[[]uint8, IpSocketAddress]{value, variant}) + case 1: + var variant1 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant1 = MakeErrorCodeAccessDenied() + + case 1: + + variant1 = MakeErrorCodeNotSupported() + + case 2: + + variant1 = MakeErrorCodeInvalidArgument() + + case 3: + + variant1 = MakeErrorCodeOutOfMemory() + + case 4: + + variant1 = MakeErrorCodeTimeout() + + case 5: + + variant1 = MakeErrorCodeInvalidState() + + case 6: + + variant1 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant1 = MakeErrorCodeAddressInUse() + + case 8: + + variant1 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant1 = MakeErrorCodeConnectionRefused() + + case 10: + + variant1 = MakeErrorCodeConnectionBroken() + + case 11: + + variant1 = MakeErrorCodeConnectionReset() + + case 12: + + variant1 = MakeErrorCodeConnectionAborted() + + case 13: + + variant1 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant1 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Tuple2[[]uint8, IpSocketAddress], ErrorCode](variant1) + default: + panic("unreachable") + } + + return result + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-local-address +func wasm_import_method_udp_socket_get_local_address(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) GetLocalAddress() witTypes.Result[IpSocketAddress, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (32 + 1*4), 4)) + wasm_import_method_udp_socket_get_local_address((self).Handle(), returnArea) + var result witTypes.Result[IpSocketAddress, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant IpSocketAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeIpSocketAddressIpv4(Ipv4SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (6 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (7 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (9 + 1*4)))))}}) + + case 1: + + variant = MakeIpSocketAddressIpv6(Ipv6SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))), witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (12 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (14 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (18 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (20 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (22 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (26 + 1*4)))))}, uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (28 + 1*4))))}) + + default: + panic("unreachable") + } + + result = witTypes.Ok[IpSocketAddress, ErrorCode](variant) + case 1: + var variant0 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant0 = MakeErrorCodeAccessDenied() + + case 1: + + variant0 = MakeErrorCodeNotSupported() + + case 2: + + variant0 = MakeErrorCodeInvalidArgument() + + case 3: + + variant0 = MakeErrorCodeOutOfMemory() + + case 4: + + variant0 = MakeErrorCodeTimeout() + + case 5: + + variant0 = MakeErrorCodeInvalidState() + + case 6: + + variant0 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant0 = MakeErrorCodeAddressInUse() + + case 8: + + variant0 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant0 = MakeErrorCodeConnectionRefused() + + case 10: + + variant0 = MakeErrorCodeConnectionBroken() + + case 11: + + variant0 = MakeErrorCodeConnectionReset() + + case 12: + + variant0 = MakeErrorCodeConnectionAborted() + + case 13: + + variant0 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant0 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[IpSocketAddress, ErrorCode](variant0) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-remote-address +func wasm_import_method_udp_socket_get_remote_address(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) GetRemoteAddress() witTypes.Result[IpSocketAddress, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (32 + 1*4), 4)) + wasm_import_method_udp_socket_get_remote_address((self).Handle(), returnArea) + var result witTypes.Result[IpSocketAddress, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + var variant IpSocketAddress + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeIpSocketAddressIpv4(Ipv4SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), witTypes.Tuple4[uint8, uint8, uint8, uint8]{uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (6 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (7 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4))))), uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (9 + 1*4)))))}}) + + case 1: + + variant = MakeIpSocketAddressIpv6(Ipv6SocketAddress{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 + 1*4))))), uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))), witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (12 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (14 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (16 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (18 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (20 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (22 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (24 + 1*4))))), uint16(uint16(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (26 + 1*4)))))}, uint32(*(*int32)(unsafe.Add(unsafe.Pointer(returnArea), (28 + 1*4))))}) + + default: + panic("unreachable") + } + + result = witTypes.Ok[IpSocketAddress, ErrorCode](variant) + case 1: + var variant0 ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant0 = MakeErrorCodeAccessDenied() + + case 1: + + variant0 = MakeErrorCodeNotSupported() + + case 2: + + variant0 = MakeErrorCodeInvalidArgument() + + case 3: + + variant0 = MakeErrorCodeOutOfMemory() + + case 4: + + variant0 = MakeErrorCodeTimeout() + + case 5: + + variant0 = MakeErrorCodeInvalidState() + + case 6: + + variant0 = MakeErrorCodeAddressNotBindable() + + case 7: + + variant0 = MakeErrorCodeAddressInUse() + + case 8: + + variant0 = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant0 = MakeErrorCodeConnectionRefused() + + case 10: + + variant0 = MakeErrorCodeConnectionBroken() + + case 11: + + variant0 = MakeErrorCodeConnectionReset() + + case 12: + + variant0 = MakeErrorCodeConnectionAborted() + + case 13: + + variant0 = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant0 = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[IpSocketAddress, ErrorCode](variant0) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-address-family +func wasm_import_method_udp_socket_get_address_family(arg0 int32) int32 + +func (self *UdpSocket) GetAddressFamily() IpAddressFamily { + + result := wasm_import_method_udp_socket_get_address_family((self).Handle()) + return uint8(result) + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-unicast-hop-limit +func wasm_import_method_udp_socket_get_unicast_hop_limit(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) GetUnicastHopLimit() witTypes.Result[uint8, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_udp_socket_get_unicast_hop_limit((self).Handle(), returnArea) + var result witTypes.Result[uint8, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint8, ErrorCode](uint8(uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint8, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.set-unicast-hop-limit +func wasm_import_method_udp_socket_set_unicast_hop_limit(arg0 int32, arg1 int32, arg2 uintptr) + +func (self *UdpSocket) SetUnicastHopLimit(value uint8) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_udp_socket_set_unicast_hop_limit((self).Handle(), int32(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-receive-buffer-size +func wasm_import_method_udp_socket_get_receive_buffer_size(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) GetReceiveBufferSize() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_udp_socket_get_receive_buffer_size((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.set-receive-buffer-size +func wasm_import_method_udp_socket_set_receive_buffer_size(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *UdpSocket) SetReceiveBufferSize(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_udp_socket_set_receive_buffer_size((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.get-send-buffer-size +func wasm_import_method_udp_socket_get_send_buffer_size(arg0 int32, arg1 uintptr) + +func (self *UdpSocket) GetSendBufferSize() witTypes.Result[uint64, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (8 + 4*4), 8)) + wasm_import_method_udp_socket_get_send_buffer_size((self).Handle(), returnArea) + var result witTypes.Result[uint64, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[uint64, ErrorCode](uint64(*(*int64)(unsafe.Add(unsafe.Pointer(returnArea), 8)))) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 8))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 1*4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 2*4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (8 + 3*4)))) + + option = witTypes.Some[string](value) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[uint64, ErrorCode](variant) + default: + panic("unreachable") + } + result0 := result + return result0 + +} + +//go:wasmimport wasi:sockets/types@0.3.0-rc-2026-03-15 [method]udp-socket.set-send-buffer-size +func wasm_import_method_udp_socket_set_send_buffer_size(arg0 int32, arg1 int64, arg2 uintptr) + +func (self *UdpSocket) SetSendBufferSize(value uint64) witTypes.Result[witTypes.Unit, ErrorCode] { + pinner := &runtime.Pinner{} + defer pinner.Unpin() + + returnArea := uintptr(witRuntime.Allocate(pinner, (5 * 4), 4)) + wasm_import_method_udp_socket_set_send_buffer_size((self).Handle(), int64(value), returnArea) + var result witTypes.Result[witTypes.Unit, ErrorCode] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 0))) { + case 0: + + result = witTypes.Ok[witTypes.Unit, ErrorCode](witTypes.Unit{}) + case 1: + var variant ErrorCode + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), 4))) { + case 0: + + variant = MakeErrorCodeAccessDenied() + + case 1: + + variant = MakeErrorCodeNotSupported() + + case 2: + + variant = MakeErrorCodeInvalidArgument() + + case 3: + + variant = MakeErrorCodeOutOfMemory() + + case 4: + + variant = MakeErrorCodeTimeout() + + case 5: + + variant = MakeErrorCodeInvalidState() + + case 6: + + variant = MakeErrorCodeAddressNotBindable() + + case 7: + + variant = MakeErrorCodeAddressInUse() + + case 8: + + variant = MakeErrorCodeRemoteUnreachable() + + case 9: + + variant = MakeErrorCodeConnectionRefused() + + case 10: + + variant = MakeErrorCodeConnectionBroken() + + case 11: + + variant = MakeErrorCodeConnectionReset() + + case 12: + + variant = MakeErrorCodeConnectionAborted() + + case 13: + + variant = MakeErrorCodeDatagramTooLarge() + + case 14: + var option witTypes.Option[string] + switch uint8(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (2 * 4)))) { + case 0: + + option = witTypes.None[string]() + case 1: + value0 := unsafe.String((*uint8)(unsafe.Pointer(uintptr(*(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (3 * 4)))))), *(*uint32)(unsafe.Add(unsafe.Pointer(returnArea), (4 * 4)))) + + option = witTypes.Some[string](value0) + default: + panic("unreachable") + } + + variant = MakeErrorCodeOther(option) + + default: + panic("unreachable") + } + + result = witTypes.Err[witTypes.Unit, ErrorCode](variant) + default: + panic("unreachable") + } + result1 := result + return result1 + +} diff --git a/examples/sdk/pkg/cli/cli.go b/examples/sdk/pkg/cli/cli.go new file mode 100644 index 0000000..f69f856 --- /dev/null +++ b/examples/sdk/pkg/cli/cli.go @@ -0,0 +1,25 @@ +package cli + +import ( + "pkg/bindings/exports/export_wasi_cli_run" + + // NOTE: The application will not compile unless the + // generated wit_exports are imported like this + _ "pkg/bindings/exports/wit_exports" + + witTypes "go.bytecodealliance.org/pkg/wit/types" +) + +type Component interface { + Run() error +} + +func RegisterExports(c Component) { + export_wasi_cli_run.Exports.Run = func() witTypes.Result[witTypes.Unit, witTypes.Unit] { + if err := c.Run(); err != nil { + panic(err) + } + + return witTypes.Ok[witTypes.Unit, witTypes.Unit](witTypes.Unit{}) + } +} diff --git a/examples/sdk/pkg/componentize-go.toml b/examples/sdk/pkg/componentize-go.toml new file mode 100644 index 0000000..3898c92 --- /dev/null +++ b/examples/sdk/pkg/componentize-go.toml @@ -0,0 +1,2 @@ +worlds = ["example:sdk/test"] +wit_paths = ["wit"] \ No newline at end of file diff --git a/examples/sdk/pkg/go.mod b/examples/sdk/pkg/go.mod new file mode 100644 index 0000000..bd70d07 --- /dev/null +++ b/examples/sdk/pkg/go.mod @@ -0,0 +1,5 @@ +module pkg + +go 1.25.5 + +require go.bytecodealliance.org/pkg v0.2.1 diff --git a/examples/sdk/pkg/go.sum b/examples/sdk/pkg/go.sum new file mode 100644 index 0000000..a18d6dc --- /dev/null +++ b/examples/sdk/pkg/go.sum @@ -0,0 +1,2 @@ +go.bytecodealliance.org/pkg v0.2.1 h1:TdRagooIcCW3UmlKqVO4cDR3GNDyfDnbiBzGI6TOvyg= +go.bytecodealliance.org/pkg v0.2.1/go.mod h1:OjA+V8g3uUFixeCKFfamm6sYhTJdg8fvwEdJ2GO0GSk= diff --git a/examples/sdk/pkg/sockets/sockets.go b/examples/sdk/pkg/sockets/sockets.go new file mode 100644 index 0000000..42ee697 --- /dev/null +++ b/examples/sdk/pkg/sockets/sockets.go @@ -0,0 +1,428 @@ +package sockets + +import ( + "encoding/binary" + "fmt" + "io" + "net/netip" + wasiSockets "pkg/bindings/imports/wasi_sockets_types" + "strconv" + "time" + + witTypes "go.bytecodealliance.org/pkg/wit/types" +) + +type IpAddressFamily uint8 + +const ( + _ IpAddressFamily = iota + IpAddressFamilyIpv4 + IpAddressFamilyIpv6 +) + +type TcpSocket struct { + inner wasiSockets.TcpSocket + rx *witTypes.StreamReader[uint8] + tx *witTypes.StreamWriter[uint8] +} + +// Create a new TCP socket. +func NewSocket(af IpAddressFamily) (TcpSocket, error) { + result := wasiSockets.TcpSocketCreate(toWasiIpAddressFamily(af)) + if result.IsErr() { + return TcpSocket{}, fmt.Errorf("Error creating TCP socket: %w", fromWitErrorCode(result.Err())) + } + + return TcpSocket{ + inner: *result.Ok(), + }, nil +} + +// Bind the socket to the provided IP address and port +func (s *TcpSocket) Bind(address string) error { + socketAddr, err := toWasiIpSockAddr(address) + if err != nil { + return err + } + result := s.inner.Bind(socketAddr) + if result.IsErr() { + return fmt.Errorf("failed to bind to socket: %w", fromWitErrorCode(result.Err())) + } + + return nil +} + +// Connect to a remote endpoint. +func (s *TcpSocket) Connect(address string) error { + socketAddr, err := toWasiIpSockAddr(address) + if err != nil { + return err + } + result := s.inner.Connect(socketAddr) + if result.IsErr() { + return fmt.Errorf("failed to connect to socket: %w", fromWitErrorCode(result.Err())) + } + return nil +} + +type Listener struct { + inner *witTypes.StreamReader[*wasiSockets.TcpSocket] +} + +func (l *Listener) Accept() (*TcpSocket, error) { + if l.inner.WriterDropped() { + return nil, io.EOF + } + buf := make([]*wasiSockets.TcpSocket, 1) + count := l.inner.Read(buf) + if count == 0 { + return nil, io.EOF + } + + sock := &TcpSocket{inner: *buf[0]} + + rx, _ := sock.inner.Receive() + sock.rx = rx + + tx, txReader := wasiSockets.MakeStreamU8() + sock.inner.Send(txReader) + sock.tx = tx + + return sock, nil +} + +func (l *Listener) Close() error { + l.inner.Drop() + return nil +} + +// Start listening and return a stream of new inbound connections. +func (s *TcpSocket) Listen() (*Listener, error) { + result := s.inner.Listen() + if result.IsErr() { + return nil, fmt.Errorf("failed to listen to socket: %w", fromWitErrorCode(result.Err())) + } + + return &Listener{ + inner: result.Ok(), + }, nil +} + +// Write data to TCP stream +func (s *TcpSocket) Write(b []byte) (int, error) { + s.tx.WriteAll(b) + return len(b), nil +} + +// Read data from TCP stream +func (s *TcpSocket) Read(b []byte) (int, error) { + if s.rx.WriterDropped() { + return 0, io.EOF + } + n := s.rx.Read(b) + return int(n), nil +} + +// Get the bound local address. +func (s *TcpSocket) GetLocalAddress() (netip.AddrPort, error) { + result := s.inner.GetLocalAddress() + if result.IsErr() { + return netip.AddrPort{}, fmt.Errorf("failed to get local address%w", fromWitErrorCode(result.Err())) + } + + return fromWasiIpSocketAddr(result.Ok()), nil +} + +// Get the remote address. +func (s *TcpSocket) GetRemoteAddress() (netip.AddrPort, error) { + result := s.inner.GetRemoteAddress() + if result.IsErr() { + return netip.AddrPort{}, fmt.Errorf("failed to get local address%w", fromWitErrorCode(result.Err())) + } + + return fromWasiIpSocketAddr(result.Ok()), nil +} + +// Whether this is a IPv4 or IPv6 socket. +func (s *TcpSocket) GetAddressFamily() IpAddressFamily { + switch s.inner.GetAddressFamily() { + case wasiSockets.IpAddressFamilyIpv4: + return IpAddressFamilyIpv4 + case wasiSockets.IpAddressFamilyIpv6: + return IpAddressFamilyIpv6 + default: + panic("GetAddressFamily has retrieved a 3rd, heretofore unknown IpAddressFamily type") + } +} + +// Hints the desired listen queue size. Host implementations might ignore this. +func (s *TcpSocket) SetListenBacklogSize(size uint64) error { + err := s.inner.SetListenBacklogSize(size) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// Indicates whether keepalive is enabled or disabled. +func (s *TcpSocket) GetKeepAliveEnabled() (bool, error) { + result := s.inner.GetKeepAliveEnabled() + if result.IsErr() { + return false, fromWitErrorCode(result.Err()) + } + return result.Ok(), nil +} + +// Enables or disables keepalive. +func (s *TcpSocket) SetKeepAliveEnabled(v bool) error { + result := s.inner.SetKeepAliveEnabled(v) + if result.IsErr() { + return fromWitErrorCode(result.Err()) + } + return nil +} + +// Amount of time the connection has been set to be idle before TCP starts +// sending keepalive packets. +func (s *TcpSocket) GetKeepAliveIdleTime() (time.Duration, error) { + result := s.inner.GetKeepAliveIdleTime() + if result.IsErr() { + return time.Duration(-1), fromWitErrorCode(result.Err()) + } + return time.Duration(result.Ok()), nil +} + +// Amount of time the connection has to be idle before TCP starts +// sending keepalive packets. +func (s *TcpSocket) SetKeepAliveIdleTime(duration time.Duration) error { + if duration < 0 { + return fmt.Errorf("duration must be >= 0") + } + err := s.inner.SetKeepAliveIdleTime(uint64(duration)) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// The time between keepalive packets. +func (s *TcpSocket) GetKeepAliveInterval() (time.Duration, error) { + result := s.inner.GetKeepAliveInterval() + if result.IsErr() { + return time.Duration(-1), fromWitErrorCode(result.Err()) + } + return time.Duration(result.Ok()), nil +} + +// The time between keepalive packets. +func (s *TcpSocket) SetKeepAliveInterval(duration time.Duration) error { + if duration < 0 { + return fmt.Errorf("duration must be >= 0") + } + err := s.inner.SetKeepAliveInterval(uint64(duration)) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// The maximum amount of keepalive packets TCP should send before +// aborting the connection. +func (s *TcpSocket) GetKeepAliveCount() (uint32, error) { + result := s.inner.GetKeepAliveCount() + if result.IsErr() { + return 0, fromWitErrorCode(result.Err()) + } + return result.Ok(), nil +} + +// The maximum amount of keepalive packets TCP should send before +// aborting the connection. +func (s *TcpSocket) SetKeepAliveCount(v uint32) error { + err := s.inner.SetKeepAliveCount(v) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. +func (s *TcpSocket) GetHopLimit() (uint8, error) { + result := s.inner.GetHopLimit() + if result.IsErr() { + return 0, fromWitErrorCode(result.Err()) + } + return result.Ok(), nil +} + +// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. +func (s *TcpSocket) SetHopLimit(v uint8) error { + err := s.inner.SetHopLimit(v) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// Kernel buffer space reserved for receiving on this socket. +func (s *TcpSocket) GetReceiveBufferSize() (uint64, error) { + result := s.inner.GetReceiveBufferSize() + if result.IsErr() { + return 0, fromWitErrorCode(result.Err()) + } + return result.Ok(), nil +} + +// Kernel buffer space reserved for receiving on this socket. +func (s *TcpSocket) SetReceiveBufferSize(size uint64) error { + err := s.inner.SetReceiveBufferSize(size) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +// Kernel buffer space reserved for sending on this socket. +func (s *TcpSocket) GetSendBufferSize() (uint64, error) { + result := s.inner.GetSendBufferSize() + if result.IsErr() { + return 0, fromWitErrorCode(result.Err()) + } + return result.Ok(), nil +} + +// Kernel buffer space reserved for sending on this socket. +func (s *TcpSocket) SetSendBufferSize(size uint64) error { + err := s.inner.SetSendBufferSize(size) + if err.IsErr() { + return fromWitErrorCode(err.Err()) + } + return nil +} + +func toWasiIpSockAddr(addr string) (wasiSockets.IpSocketAddress, error) { + ip, err := netip.ParseAddrPort(addr) + if err != nil { + return wasiSockets.IpSocketAddress{}, err + } + + var socketAddr wasiSockets.IpSocketAddress + + if ip.Addr().Is4() { + b := ip.Addr().As4() + socketAddr = wasiSockets.MakeIpSocketAddressIpv4(wasiSockets.Ipv4SocketAddress{ + Address: witTypes.Tuple4[uint8, uint8, uint8, uint8]{ + F0: b[0], + F1: b[1], + F2: b[2], + F3: b[3], + }, + Port: ip.Port(), + }) + } else if ip.Addr().Is6() { + b := ip.Addr().As16() + + // Zone == ScopeId + var scope uint32 + if z := ip.Addr().Zone(); z != "" { + n, err := strconv.ParseUint(z, 10, 32) + if err != nil { + // Non-numeric zone (e.g. "eth0") + return wasiSockets.IpSocketAddress{}, fmt.Errorf("non-numeric zone %q: %w", z, err) + } + scope = uint32(n) + } + socketAddr = wasiSockets.MakeIpSocketAddressIpv6(wasiSockets.Ipv6SocketAddress{ + FlowInfo: 0, // Setting to 0 since the net/netip package doesn't expose this + Address: witTypes.Tuple8[uint16, uint16, uint16, uint16, uint16, uint16, uint16, uint16]{ + F0: binary.BigEndian.Uint16(b[0:2]), + F1: binary.BigEndian.Uint16(b[2:4]), + F2: binary.BigEndian.Uint16(b[4:6]), + F3: binary.BigEndian.Uint16(b[6:8]), + F4: binary.BigEndian.Uint16(b[8:10]), + F5: binary.BigEndian.Uint16(b[10:12]), + F6: binary.BigEndian.Uint16(b[12:14]), + F7: binary.BigEndian.Uint16(b[14:16]), + }, + Port: ip.Port(), + ScopeId: scope, + }) + + } else { + panic("parsed ip addr is neither ipv4 nor ipv6") + } + + return socketAddr, nil +} + +func fromWasiIpSocketAddr(addr wasiSockets.IpSocketAddress) netip.AddrPort { + switch addr.Tag() { + case wasiSockets.IpSocketAddressIpv4: + v4 := addr.Ipv4() + b := v4.Address + ip := netip.AddrFrom4([4]byte{b.F0, b.F1, b.F2, b.F3}) + return netip.AddrPortFrom(ip, v4.Port) + case wasiSockets.IpSocketAddressIpv6: + v6 := addr.Ipv6() + a := v6.Address + var b [16]byte + binary.BigEndian.PutUint16(b[0:2], a.F0) + binary.BigEndian.PutUint16(b[2:4], a.F1) + binary.BigEndian.PutUint16(b[4:6], a.F2) + binary.BigEndian.PutUint16(b[6:8], a.F3) + binary.BigEndian.PutUint16(b[8:10], a.F4) + binary.BigEndian.PutUint16(b[10:12], a.F5) + binary.BigEndian.PutUint16(b[12:14], a.F6) + binary.BigEndian.PutUint16(b[14:16], a.F7) + ip := netip.AddrFrom16(b) + return netip.AddrPortFrom(ip, v6.Port) + default: + panic(fmt.Sprintf("unimplemented IpSocketAddress type: %v", addr)) + } +} + +func toWasiIpAddressFamily(af IpAddressFamily) wasiSockets.IpAddressFamily { + switch af { + case IpAddressFamilyIpv4: + return wasiSockets.IpAddressFamilyIpv4 + case IpAddressFamilyIpv6: + return wasiSockets.IpAddressFamilyIpv6 + default: + panic("Wow, who could've guessed that this code would live to see a THIRD IpAddress family?!") + } +} + +func fromWitErrorCode(err wasiSockets.ErrorCode) error { + switch err.Tag() { + case wasiSockets.ErrorCodeOther: + return fmt.Errorf("other error") + case wasiSockets.ErrorCodeAccessDenied: + return fmt.Errorf("access denied") + case wasiSockets.ErrorCodeNotSupported: + return fmt.Errorf("operation is not supported") + case wasiSockets.ErrorCodeInvalidArgument: + return fmt.Errorf("one of the argumenets is invalid") + case wasiSockets.ErrorCodeOutOfMemory: + return fmt.Errorf("out of memory") + case wasiSockets.ErrorCodeTimeout: + return fmt.Errorf("not enough memory to complete the operation") + case wasiSockets.ErrorCodeInvalidState: + return fmt.Errorf("operation is not valid in the socket's current state") + case wasiSockets.ErrorCodeAddressNotBindable: + return fmt.Errorf("bind operation failed because the provided address is not an address that the `network` can bind to") + case wasiSockets.ErrorCodeAddressInUse: + return fmt.Errorf("bind operation failed because the provided address is already in use or because there are no ephemeral ports available") + case wasiSockets.ErrorCodeRemoteUnreachable: + return fmt.Errorf("remote address is not reachable") + case wasiSockets.ErrorCodeConnectionRefused: + return fmt.Errorf("TCP connection was forcefully rejected") + case wasiSockets.ErrorCodeConnectionReset: + return fmt.Errorf("TCP connection was reset") + case wasiSockets.ErrorCodeConnectionAborted: + return fmt.Errorf("TCP connection was aborted") + case wasiSockets.ErrorCodeDatagramTooLarge: + return fmt.Errorf("size of a datagram sent to a UDP socket exceeded the maximum supported size") + default: + panic("unimplemented error code") + } +} diff --git a/examples/sdk/pkg/wit/deps/wasi-cli-0.3.0-rc-2026-03-15/package.wit b/examples/sdk/pkg/wit/deps/wasi-cli-0.3.0-rc-2026-03-15/package.wit new file mode 100644 index 0000000..8ba52c5 --- /dev/null +++ b/examples/sdk/pkg/wit/deps/wasi-cli-0.3.0-rc-2026-03-15/package.wit @@ -0,0 +1,256 @@ +package wasi:cli@0.3.0-rc-2026-03-15; + +@since(version = 0.3.0-rc-2026-03-15) +interface environment { + /// Get the POSIX-style environment variables. + /// + /// Each environment variable is provided as a pair of string variable names + /// and string value. + /// + /// Morally, these are a value import, but until value imports are available + /// in the component model, this import function should return the same + /// values each time it is called. + @since(version = 0.3.0-rc-2026-03-15) + get-environment: func() -> list>; + + /// Get the POSIX-style arguments to the program. + @since(version = 0.3.0-rc-2026-03-15) + get-arguments: func() -> list; + + /// Return a path that programs should use as their initial current working + /// directory, interpreting `.` as shorthand for this. + @since(version = 0.3.0-rc-2026-03-15) + get-initial-cwd: func() -> option; +} + +@since(version = 0.3.0-rc-2026-03-15) +interface exit { + /// Exit the current instance and any linked instances. + @since(version = 0.3.0-rc-2026-03-15) + exit: func(status: result); + + /// Exit the current instance and any linked instances, reporting the + /// specified status code to the host. + /// + /// The meaning of the code depends on the context, with 0 usually meaning + /// "success", and other values indicating various types of failure. + /// + /// This function does not return; the effect is analogous to a trap, but + /// without the connotation that something bad has happened. + @unstable(feature = cli-exit-with-code) + exit-with-code: func(status-code: u8); +} + +@since(version = 0.3.0-rc-2026-03-15) +interface run { + /// Run the program. + @since(version = 0.3.0-rc-2026-03-15) + run: async func() -> result; +} + +@since(version = 0.3.0-rc-2026-03-15) +interface types { + @since(version = 0.3.0-rc-2026-03-15) + enum error-code { + /// Input/output error + io, + /// Invalid or incomplete multibyte or wide character + illegal-byte-sequence, + /// Broken pipe + pipe, + } +} + +@since(version = 0.3.0-rc-2026-03-15) +interface stdin { + use types.{error-code}; + + /// Return a stream for reading from stdin. + /// + /// This function returns a stream which provides data read from stdin, + /// and a future to signal read results. + /// + /// If the stream's readable end is dropped the future will resolve to success. + /// + /// If the stream's writable end is dropped the future will either resolve to + /// success if stdin was closed by the writer or to an error-code if reading + /// failed for some other reason. + /// + /// Multiple streams may be active at the same time. The behavior of concurrent + /// reads is implementation-specific. + @since(version = 0.3.0-rc-2026-03-15) + read-via-stream: func() -> tuple, future>>; +} + +@since(version = 0.3.0-rc-2026-03-15) +interface stdout { + use types.{error-code}; + + /// Write the given stream to stdout. + /// + /// If the stream's writable end is dropped this function will either return + /// success once the entire contents of the stream have been written or an + /// error-code representing a failure. + /// + /// Otherwise if there is an error the readable end of the stream will be + /// dropped and this function will return an error-code. + @since(version = 0.3.0-rc-2026-03-15) + write-via-stream: func(data: stream) -> future>; +} + +@since(version = 0.3.0-rc-2026-03-15) +interface stderr { + use types.{error-code}; + + /// Write the given stream to stderr. + /// + /// If the stream's writable end is dropped this function will either return + /// success once the entire contents of the stream have been written or an + /// error-code representing a failure. + /// + /// Otherwise if there is an error the readable end of the stream will be + /// dropped and this function will return an error-code. + @since(version = 0.3.0-rc-2026-03-15) + write-via-stream: func(data: stream) -> future>; +} + +/// Terminal input. +/// +/// In the future, this may include functions for disabling echoing, +/// disabling input buffering so that keyboard events are sent through +/// immediately, querying supported features, and so on. +@since(version = 0.3.0-rc-2026-03-15) +interface terminal-input { + /// The input side of a terminal. + @since(version = 0.3.0-rc-2026-03-15) + resource terminal-input; +} + +/// Terminal output. +/// +/// In the future, this may include functions for querying the terminal +/// size, being notified of terminal size changes, querying supported +/// features, and so on. +@since(version = 0.3.0-rc-2026-03-15) +interface terminal-output { + /// The output side of a terminal. + @since(version = 0.3.0-rc-2026-03-15) + resource terminal-output; +} + +/// An interface providing an optional `terminal-input` for stdin as a +/// link-time authority. +@since(version = 0.3.0-rc-2026-03-15) +interface terminal-stdin { + @since(version = 0.3.0-rc-2026-03-15) + use terminal-input.{terminal-input}; + + /// If stdin is connected to a terminal, return a `terminal-input` handle + /// allowing further interaction with it. + @since(version = 0.3.0-rc-2026-03-15) + get-terminal-stdin: func() -> option; +} + +/// An interface providing an optional `terminal-output` for stdout as a +/// link-time authority. +@since(version = 0.3.0-rc-2026-03-15) +interface terminal-stdout { + @since(version = 0.3.0-rc-2026-03-15) + use terminal-output.{terminal-output}; + + /// If stdout is connected to a terminal, return a `terminal-output` handle + /// allowing further interaction with it. + @since(version = 0.3.0-rc-2026-03-15) + get-terminal-stdout: func() -> option; +} + +/// An interface providing an optional `terminal-output` for stderr as a +/// link-time authority. +@since(version = 0.3.0-rc-2026-03-15) +interface terminal-stderr { + @since(version = 0.3.0-rc-2026-03-15) + use terminal-output.{terminal-output}; + + /// If stderr is connected to a terminal, return a `terminal-output` handle + /// allowing further interaction with it. + @since(version = 0.3.0-rc-2026-03-15) + get-terminal-stderr: func() -> option; +} + +@since(version = 0.3.0-rc-2026-03-15) +world imports { + @since(version = 0.3.0-rc-2026-03-15) + import environment; + @since(version = 0.3.0-rc-2026-03-15) + import exit; + @since(version = 0.3.0-rc-2026-03-15) + import types; + @since(version = 0.3.0-rc-2026-03-15) + import stdin; + @since(version = 0.3.0-rc-2026-03-15) + import stdout; + @since(version = 0.3.0-rc-2026-03-15) + import stderr; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-input; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-output; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stdin; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stdout; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stderr; + import wasi:clocks/types@0.3.0-rc-2026-03-15; + import wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15; + import wasi:clocks/system-clock@0.3.0-rc-2026-03-15; + @unstable(feature = clocks-timezone) + import wasi:clocks/timezone@0.3.0-rc-2026-03-15; + import wasi:filesystem/types@0.3.0-rc-2026-03-15; + import wasi:filesystem/preopens@0.3.0-rc-2026-03-15; + import wasi:sockets/types@0.3.0-rc-2026-03-15; + import wasi:sockets/ip-name-lookup@0.3.0-rc-2026-03-15; + import wasi:random/random@0.3.0-rc-2026-03-15; + import wasi:random/insecure@0.3.0-rc-2026-03-15; + import wasi:random/insecure-seed@0.3.0-rc-2026-03-15; +} +@since(version = 0.3.0-rc-2026-03-15) +world command { + @since(version = 0.3.0-rc-2026-03-15) + import environment; + @since(version = 0.3.0-rc-2026-03-15) + import exit; + @since(version = 0.3.0-rc-2026-03-15) + import types; + @since(version = 0.3.0-rc-2026-03-15) + import stdin; + @since(version = 0.3.0-rc-2026-03-15) + import stdout; + @since(version = 0.3.0-rc-2026-03-15) + import stderr; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-input; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-output; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stdin; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stdout; + @since(version = 0.3.0-rc-2026-03-15) + import terminal-stderr; + import wasi:clocks/types@0.3.0-rc-2026-03-15; + import wasi:clocks/monotonic-clock@0.3.0-rc-2026-03-15; + import wasi:clocks/system-clock@0.3.0-rc-2026-03-15; + @unstable(feature = clocks-timezone) + import wasi:clocks/timezone@0.3.0-rc-2026-03-15; + import wasi:filesystem/types@0.3.0-rc-2026-03-15; + import wasi:filesystem/preopens@0.3.0-rc-2026-03-15; + import wasi:sockets/types@0.3.0-rc-2026-03-15; + import wasi:sockets/ip-name-lookup@0.3.0-rc-2026-03-15; + import wasi:random/random@0.3.0-rc-2026-03-15; + import wasi:random/insecure@0.3.0-rc-2026-03-15; + import wasi:random/insecure-seed@0.3.0-rc-2026-03-15; + + @since(version = 0.3.0-rc-2026-03-15) + export run; +} diff --git a/examples/sdk/pkg/wit/deps/wasi-clocks-0.3.0-rc-2026-03-15/package.wit b/examples/sdk/pkg/wit/deps/wasi-clocks-0.3.0-rc-2026-03-15/package.wit new file mode 100644 index 0000000..9e39e1d --- /dev/null +++ b/examples/sdk/pkg/wit/deps/wasi-clocks-0.3.0-rc-2026-03-15/package.wit @@ -0,0 +1,43 @@ +package wasi:clocks@0.3.0-rc-2026-03-15; + +interface types { + type duration = u64; +} + +interface monotonic-clock { + use types.{duration}; + + type mark = u64; + + now: func() -> mark; + + get-resolution: func() -> duration; + + wait-until: async func(when: mark); + + wait-for: async func(how-long: duration); +} + +interface system-clock { + use types.{duration}; + + record instant { + seconds: s64, + nanoseconds: u32, + } + + now: func() -> instant; + + get-resolution: func() -> duration; +} + +interface timezone { + use system-clock.{instant}; + + iana-id: func() -> option; + + utc-offset: func(when: instant) -> option; + + to-debug-string: func() -> string; +} + diff --git a/examples/sdk/pkg/wit/deps/wasi-filesystem-0.3.0-rc-2026-03-15/package.wit b/examples/sdk/pkg/wit/deps/wasi-filesystem-0.3.0-rc-2026-03-15/package.wit new file mode 100644 index 0000000..9692ed4 --- /dev/null +++ b/examples/sdk/pkg/wit/deps/wasi-filesystem-0.3.0-rc-2026-03-15/package.wit @@ -0,0 +1,149 @@ +package wasi:filesystem@0.3.0-rc-2026-03-15; + +interface types { + use wasi:clocks/system-clock@0.3.0-rc-2026-03-15.{instant}; + + type filesize = u64; + + variant descriptor-type { + block-device, + character-device, + directory, + fifo, + symbolic-link, + regular-file, + socket, + other(option), + } + + flags descriptor-flags { + read, + write, + file-integrity-sync, + data-integrity-sync, + requested-write-sync, + mutate-directory, + } + + flags path-flags { + symlink-follow, + } + + flags open-flags { + create, + directory, + exclusive, + truncate, + } + + type link-count = u64; + + record descriptor-stat { + %type: descriptor-type, + link-count: link-count, + size: filesize, + data-access-timestamp: option, + data-modification-timestamp: option, + status-change-timestamp: option, + } + + variant new-timestamp { + no-change, + now, + timestamp(instant), + } + + record directory-entry { + %type: descriptor-type, + name: string, + } + + variant error-code { + access, + already, + bad-descriptor, + busy, + deadlock, + quota, + exist, + file-too-large, + illegal-byte-sequence, + in-progress, + interrupted, + invalid, + io, + is-directory, + loop, + too-many-links, + message-size, + name-too-long, + no-device, + no-entry, + no-lock, + insufficient-memory, + insufficient-space, + not-directory, + not-empty, + not-recoverable, + unsupported, + no-tty, + no-such-device, + overflow, + not-permitted, + pipe, + read-only, + invalid-seek, + text-file-busy, + cross-device, + other(option), + } + + enum advice { + normal, + sequential, + random, + will-need, + dont-need, + no-reuse, + } + + record metadata-hash-value { + lower: u64, + upper: u64, + } + + resource descriptor { + read-via-stream: func(offset: filesize) -> tuple, future>>; + write-via-stream: func(data: stream, offset: filesize) -> future>; + append-via-stream: func(data: stream) -> future>; + advise: async func(offset: filesize, length: filesize, advice: advice) -> result<_, error-code>; + sync-data: async func() -> result<_, error-code>; + get-flags: async func() -> result; + get-type: async func() -> result; + set-size: async func(size: filesize) -> result<_, error-code>; + set-times: async func(data-access-timestamp: new-timestamp, data-modification-timestamp: new-timestamp) -> result<_, error-code>; + read-directory: func() -> tuple, future>>; + sync: async func() -> result<_, error-code>; + create-directory-at: async func(path: string) -> result<_, error-code>; + stat: async func() -> result; + stat-at: async func(path-flags: path-flags, path: string) -> result; + set-times-at: async func(path-flags: path-flags, path: string, data-access-timestamp: new-timestamp, data-modification-timestamp: new-timestamp) -> result<_, error-code>; + link-at: async func(old-path-flags: path-flags, old-path: string, new-descriptor: borrow, new-path: string) -> result<_, error-code>; + open-at: async func(path-flags: path-flags, path: string, open-flags: open-flags, %flags: descriptor-flags) -> result; + readlink-at: async func(path: string) -> result; + remove-directory-at: async func(path: string) -> result<_, error-code>; + rename-at: async func(old-path: string, new-descriptor: borrow, new-path: string) -> result<_, error-code>; + symlink-at: async func(old-path: string, new-path: string) -> result<_, error-code>; + unlink-file-at: async func(path: string) -> result<_, error-code>; + is-same-object: async func(other: borrow) -> bool; + metadata-hash: async func() -> result; + metadata-hash-at: async func(path-flags: path-flags, path: string) -> result; + } +} + +interface preopens { + use types.{descriptor}; + + get-directories: func() -> list>; +} + diff --git a/examples/sdk/pkg/wit/deps/wasi-random-0.3.0-rc-2026-03-15/package.wit b/examples/sdk/pkg/wit/deps/wasi-random-0.3.0-rc-2026-03-15/package.wit new file mode 100644 index 0000000..d5cb224 --- /dev/null +++ b/examples/sdk/pkg/wit/deps/wasi-random-0.3.0-rc-2026-03-15/package.wit @@ -0,0 +1,18 @@ +package wasi:random@0.3.0-rc-2026-03-15; + +interface random { + get-random-bytes: func(max-len: u64) -> list; + + get-random-u64: func() -> u64; +} + +interface insecure { + get-insecure-random-bytes: func(max-len: u64) -> list; + + get-insecure-random-u64: func() -> u64; +} + +interface insecure-seed { + get-insecure-seed: func() -> tuple; +} + diff --git a/examples/sdk/pkg/wit/deps/wasi-sockets-0.3.0-rc-2026-03-15/package.wit b/examples/sdk/pkg/wit/deps/wasi-sockets-0.3.0-rc-2026-03-15/package.wit new file mode 100644 index 0000000..cde2e4d --- /dev/null +++ b/examples/sdk/pkg/wit/deps/wasi-sockets-0.3.0-rc-2026-03-15/package.wit @@ -0,0 +1,839 @@ +package wasi:sockets@0.3.0-rc-2026-03-15; + +@since(version = 0.3.0-rc-2026-03-15) +interface types { + @since(version = 0.3.0-rc-2026-03-15) + use wasi:clocks/types@0.3.0-rc-2026-03-15.{duration}; + + /// Error codes. + /// + /// In theory, every API can return any error code. + /// In practice, API's typically only return the errors documented per API + /// combined with a couple of errors that are always possible: + /// - `other` + /// - `access-denied` + /// - `not-supported` + /// - `out-of-memory` + /// + /// See each individual API for what the POSIX equivalents are. They sometimes differ per API. + @since(version = 0.3.0-rc-2026-03-15) + variant error-code { + /// Access denied. + /// + /// POSIX equivalent: EACCES, EPERM + access-denied, + /// The operation is not supported. + /// + /// POSIX equivalent: EOPNOTSUPP, ENOPROTOOPT, EPFNOSUPPORT, EPROTONOSUPPORT, ESOCKTNOSUPPORT + not-supported, + /// One of the arguments is invalid. + /// + /// POSIX equivalent: EINVAL, EDESTADDRREQ, EAFNOSUPPORT + invalid-argument, + /// Not enough memory to complete the operation. + /// + /// POSIX equivalent: ENOMEM, ENOBUFS + out-of-memory, + /// The operation timed out before it could finish completely. + /// + /// POSIX equivalent: ETIMEDOUT + timeout, + /// The operation is not valid in the socket's current state. + invalid-state, + /// The local address is not available. + /// + /// POSIX equivalent: EADDRNOTAVAIL + address-not-bindable, + /// A bind operation failed because the provided address is already in + /// use or because there are no ephemeral ports available. + /// + /// POSIX equivalent: EADDRINUSE + address-in-use, + /// The remote address is not reachable. + /// + /// POSIX equivalent: EHOSTUNREACH, EHOSTDOWN, ENETDOWN, ENETUNREACH, ENONET + remote-unreachable, + /// The connection was forcefully rejected. + /// + /// POSIX equivalent: ECONNREFUSED + connection-refused, + /// A write failed because the connection was broken. + /// + /// POSIX equivalent: EPIPE + connection-broken, + /// The connection was reset. + /// + /// POSIX equivalent: ECONNRESET + connection-reset, + /// The connection was aborted. + /// + /// POSIX equivalent: ECONNABORTED + connection-aborted, + /// The size of a datagram sent to a UDP socket exceeded the maximum + /// supported size. + /// + /// POSIX equivalent: EMSGSIZE + datagram-too-large, + /// A catch-all for errors not captured by the existing variants. + /// Implementations can use this to extend the error type without + /// breaking existing code. + other(option), + } + + @since(version = 0.3.0-rc-2026-03-15) + enum ip-address-family { + /// Similar to `AF_INET` in POSIX. + ipv4, + /// Similar to `AF_INET6` in POSIX. + ipv6, + } + + @since(version = 0.3.0-rc-2026-03-15) + type ipv4-address = tuple; + + @since(version = 0.3.0-rc-2026-03-15) + type ipv6-address = tuple; + + @since(version = 0.3.0-rc-2026-03-15) + variant ip-address { + ipv4(ipv4-address), + ipv6(ipv6-address), + } + + @since(version = 0.3.0-rc-2026-03-15) + record ipv4-socket-address { + /// sin_port + port: u16, + /// sin_addr + address: ipv4-address, + } + + @since(version = 0.3.0-rc-2026-03-15) + record ipv6-socket-address { + /// sin6_port + port: u16, + /// sin6_flowinfo + flow-info: u32, + /// sin6_addr + address: ipv6-address, + /// sin6_scope_id + scope-id: u32, + } + + @since(version = 0.3.0-rc-2026-03-15) + variant ip-socket-address { + ipv4(ipv4-socket-address), + ipv6(ipv6-socket-address), + } + + /// A TCP socket resource. + /// + /// The socket can be in one of the following states: + /// - `unbound` + /// - `bound` (See note below) + /// - `listening` + /// - `connecting` + /// - `connected` + /// - `closed` + /// See + /// for more information. + /// + /// Note: Except where explicitly mentioned, whenever this documentation uses + /// the term "bound" without backticks it actually means: in the `bound` state *or higher*. + /// (i.e. `bound`, `listening`, `connecting` or `connected`) + /// + /// WASI uses shared ownership semantics: the `tcp-socket` handle and all + /// derived `stream` and `future` values reference a single underlying OS + /// socket: + /// - Send/receive streams remain functional after the original `tcp-socket` + /// handle is dropped. + /// - The stream returned by `listen` behaves similarly. + /// - Client sockets returned by `tcp-socket::listen` are independent and do + /// not keep the listening socket alive. + /// + /// The OS socket is closed only after the last handle is dropped. This + /// model has observable effects; for example, it affects when the local + /// port binding is released. + /// + /// In addition to the general error codes documented on the + /// `types::error-code` type, TCP socket methods may always return + /// `error(invalid-state)` when in the `closed` state. + @since(version = 0.3.0-rc-2026-03-15) + resource tcp-socket { + /// Create a new TCP socket. + /// + /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` + /// in POSIX. On IPv6 sockets, IPV6_V6ONLY is enabled by default and + /// can't be configured otherwise. + /// + /// Unlike POSIX, WASI sockets have no notion of a socket-level + /// `O_NONBLOCK` flag. Instead they fully rely on the Component Model's + /// async support. + /// + /// # Typical errors + /// - `not-supported`: The `address-family` is not supported. (EAFNOSUPPORT) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + create: static func(address-family: ip-address-family) -> result; + /// Bind the socket to the provided IP address and port. + /// + /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is + /// left to the implementation to decide which network interface(s) to + /// bind to. If the TCP/UDP port is zero, the socket will be bound to a + /// random free port. + /// + /// Bind can be attempted multiple times on the same socket, even with + /// different arguments on each iteration. But never concurrently and + /// only as long as the previous bind failed. Once a bind succeeds, the + /// binding can't be changed anymore. + /// + /// # Typical errors + /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + /// - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) + /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address. (EINVAL) + /// - `invalid-state`: The socket is already bound. (EINVAL) + /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + /// - `address-in-use`: Address is already in use. (EADDRINUSE) + /// - `address-not-bindable`: `local-address` is not an address that can be bound to. (EADDRNOTAVAIL) + /// + /// # Implementors note + /// The bind operation shouldn't be affected by the TIME_WAIT state of a + /// recently closed socket on the same local address. In practice this + /// means that the SO_REUSEADDR socket option should be set implicitly + /// on all platforms, except on Windows where this is the default + /// behavior and SO_REUSEADDR performs something different. + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + bind: func(local-address: ip-socket-address) -> result<_, error-code>; + /// Connect to a remote endpoint. + /// + /// On success, the socket is transitioned into the `connected` state + /// and the `remote-address` of the socket is updated. + /// The `local-address` may be updated as well, based on the best network + /// path to `remote-address`. If the socket was not already explicitly + /// bound, this function will implicitly bind the socket to a random + /// free port. + /// + /// After a failed connection attempt, the socket will be in the `closed` + /// state and the only valid action left is to `drop` the socket. A single + /// socket can not be used to connect more than once. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) + /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address. (EINVAL, EADDRNOTAVAIL on Illumos) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) + /// - `invalid-state`: The socket is already in the `connecting` state. (EALREADY) + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN) + /// - `invalid-state`: The socket is already in the `listening` state. (EOPNOTSUPP, EINVAL on Windows) + /// - `timeout`: Connection timed out. (ETIMEDOUT) + /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) + /// - `connection-reset`: The connection was reset. (ECONNRESET) + /// - `connection-aborted`: The connection was aborted. (ECONNABORTED) + /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + connect: async func(remote-address: ip-socket-address) -> result<_, error-code>; + /// Start listening and return a stream of new inbound connections. + /// + /// Transitions the socket into the `listening` state. This can be called + /// at most once per socket. + /// + /// If the socket is not already explicitly bound, this function will + /// implicitly bind the socket to a random free port. + /// + /// Normally, the returned sockets are bound, in the `connected` state + /// and immediately ready for I/O. Though, depending on exact timing and + /// circumstances, a newly accepted connection may already be `closed` + /// by the time the server attempts to perform its first I/O on it. This + /// is true regardless of whether the WASI implementation uses + /// "synthesized" sockets or not (see Implementors Notes below). + /// + /// The following properties are inherited from the listener socket: + /// - `address-family` + /// - `keep-alive-enabled` + /// - `keep-alive-idle-time` + /// - `keep-alive-interval` + /// - `keep-alive-count` + /// - `hop-limit` + /// - `receive-buffer-size` + /// - `send-buffer-size` + /// + /// # Typical errors + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN, EINVAL on BSD) + /// - `invalid-state`: The socket is already in the `listening` state. + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) + /// + /// # Implementors note + /// This method returns a single perpetual stream that should only close + /// on fatal errors (if any). Yet, the POSIX' `accept` function may also + /// return transient errors (e.g. ECONNABORTED). The exact details differ + /// per operation system. For example, the Linux manual mentions: + /// + /// > Linux accept() passes already-pending network errors on the new + /// > socket as an error code from accept(). This behavior differs from + /// > other BSD socket implementations. For reliable operation the + /// > application should detect the network errors defined for the + /// > protocol after accept() and treat them like EAGAIN by retrying. + /// > In the case of TCP/IP, these are ENETDOWN, EPROTO, ENOPROTOOPT, + /// > EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, and ENETUNREACH. + /// Source: https://man7.org/linux/man-pages/man2/accept.2.html + /// + /// WASI implementations have two options to handle this: + /// - Optionally log it and then skip over non-fatal errors returned by + /// `accept`. Guest code never gets to see these failures. Or: + /// - Synthesize a `tcp-socket` resource that exposes the error when + /// attempting to send or receive on it. Guest code then sees these + /// failures as regular I/O errors. + /// + /// In either case, the stream returned by this `listen` method remains + /// operational. + /// + /// WASI requires `listen` to perform an implicit bind if the socket + /// has not already been bound. Not all platforms (notably Windows) + /// exhibit this behavior out of the box. On platforms that require it, + /// the WASI implementation can emulate this behavior by performing + /// the bind itself if the guest hasn't already done so. + /// + /// # References + /// - + /// - + /// - + /// - + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + listen: func() -> result, error-code>; + /// Transmit data to peer. + /// + /// The caller should close the stream when it has no more data to send + /// to the peer. Under normal circumstances this will cause a FIN packet + /// to be sent out. Closing the stream is equivalent to calling + /// `shutdown(SHUT_WR)` in POSIX. + /// + /// This function may be called at most once and returns once the full + /// contents of the stream are transmitted or an error is encountered. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) + /// - `invalid-state`: `send` has already been called on this socket. + /// - `connection-broken`: The connection is not writable anymore. (EPIPE, ECONNABORTED on Windows) + /// - `connection-reset`: The connection was reset. (ECONNRESET) + /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + send: func(data: stream) -> future>; + /// Read data from peer. + /// + /// Returns a `stream` of data sent by the peer. The implementation + /// drops the stream once no more data is available. At that point, the + /// returned `future` resolves to: + /// - `ok` after a graceful shutdown from the peer (i.e. a FIN packet), or + /// - `err` if the socket was closed abnormally. + /// + /// `receive` may be called only once per socket. Subsequent calls return + /// a closed stream and a future resolved to `err(invalid-state)`. + /// + /// If the caller is not expecting to receive any more data from the peer, + /// they should drop the stream. Any data still in the receive queue + /// will be discarded. This is equivalent to calling `shutdown(SHUT_RD)` + /// in POSIX. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) + /// - `invalid-state`: `receive` has already been called on this socket. + /// - `connection-reset`: The connection was reset. (ECONNRESET) + /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + receive: func() -> tuple, future>>; + /// Get the bound local address. + /// + /// POSIX mentions: + /// > If the socket has not been bound to a local name, the value + /// > stored in the object pointed to by `address` is unspecified. + /// + /// WASI is stricter and requires `get-local-address` to return + /// `invalid-state` when the socket hasn't been bound yet. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not bound to any local address. + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + get-local-address: func() -> result; + /// Get the remote address. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not connected to a remote address. (ENOTCONN) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + get-remote-address: func() -> result; + /// Whether the socket is in the `listening` state. + /// + /// Equivalent to the SO_ACCEPTCONN socket option. + @since(version = 0.3.0-rc-2026-03-15) + get-is-listening: func() -> bool; + /// Whether this is a IPv4 or IPv6 socket. + /// + /// This is the value passed to the constructor. + /// + /// Equivalent to the SO_DOMAIN socket option. + @since(version = 0.3.0-rc-2026-03-15) + get-address-family: func() -> ip-address-family; + /// Hints the desired listen queue size. Implementations are free to + /// ignore this. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// Any other value will never cause an error, but it might be silently + /// clamped and/or rounded. + /// + /// # Typical errors + /// - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. + /// - `invalid-argument`: (set) The provided value was 0. + /// - `invalid-state`: (set) The socket is in the `connecting` or `connected` state. + @since(version = 0.3.0-rc-2026-03-15) + set-listen-backlog-size: func(value: u64) -> result<_, error-code>; + /// Enables or disables keepalive. + /// + /// The keepalive behavior can be adjusted using: + /// - `keep-alive-idle-time` + /// - `keep-alive-interval` + /// - `keep-alive-count` + /// These properties can be configured while `keep-alive-enabled` is + /// false, but only come into effect when `keep-alive-enabled` is true. + /// + /// Equivalent to the SO_KEEPALIVE socket option. + @since(version = 0.3.0-rc-2026-03-15) + get-keep-alive-enabled: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-keep-alive-enabled: func(value: bool) -> result<_, error-code>; + /// Amount of time the connection has to be idle before TCP starts + /// sending keepalive packets. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// All other values are accepted without error, but may be + /// clamped or rounded. As a result, the value read back from + /// this setting may differ from the value that was set. + /// + /// Equivalent to the TCP_KEEPIDLE socket option. (TCP_KEEPALIVE on MacOS) + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + @since(version = 0.3.0-rc-2026-03-15) + get-keep-alive-idle-time: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-keep-alive-idle-time: func(value: duration) -> result<_, error-code>; + /// The time between keepalive packets. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// All other values are accepted without error, but may be + /// clamped or rounded. As a result, the value read back from + /// this setting may differ from the value that was set. + /// + /// Equivalent to the TCP_KEEPINTVL socket option. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + @since(version = 0.3.0-rc-2026-03-15) + get-keep-alive-interval: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-keep-alive-interval: func(value: duration) -> result<_, error-code>; + /// The maximum amount of keepalive packets TCP should send before + /// aborting the connection. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// All other values are accepted without error, but may be + /// clamped or rounded. As a result, the value read back from + /// this setting may differ from the value that was set. + /// + /// Equivalent to the TCP_KEEPCNT socket option. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + @since(version = 0.3.0-rc-2026-03-15) + get-keep-alive-count: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-keep-alive-count: func(value: u32) -> result<_, error-code>; + /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The TTL value must be 1 or higher. + @since(version = 0.3.0-rc-2026-03-15) + get-hop-limit: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-hop-limit: func(value: u8) -> result<_, error-code>; + /// Kernel buffer space reserved for sending/receiving on this socket. + /// Implementations usually treat this as a cap the buffer can grow to, + /// rather than allocating the full amount immediately. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// All other values are accepted without error, but may be + /// clamped or rounded. As a result, the value read back from + /// this setting may differ from the value that was set. + /// + /// This is only a performance hint. The implementation may ignore it or + /// tweak it based on real traffic patterns. + /// Linux and macOS appear to behave differently depending on whether a + /// buffer size was explicitly set. When set, they tend to honor it; when + /// not set, they dynamically adjust the buffer size as the connection + /// progresses. This is especially noticeable when comparing the values + /// from before and after connection establishment. + /// + /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + @since(version = 0.3.0-rc-2026-03-15) + get-receive-buffer-size: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-receive-buffer-size: func(value: u64) -> result<_, error-code>; + @since(version = 0.3.0-rc-2026-03-15) + get-send-buffer-size: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-send-buffer-size: func(value: u64) -> result<_, error-code>; + } + + /// A UDP socket handle. + @since(version = 0.3.0-rc-2026-03-15) + resource udp-socket { + /// Create a new UDP socket. + /// + /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` + /// in POSIX. On IPv6 sockets, IPV6_V6ONLY is enabled by default and + /// can't be configured otherwise. + /// + /// Unlike POSIX, WASI sockets have no notion of a socket-level + /// `O_NONBLOCK` flag. Instead they fully rely on the Component Model's + /// async support. + /// + /// # References: + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + create: static func(address-family: ip-address-family) -> result; + /// Bind the socket to the provided IP address and port. + /// + /// If the IP address is zero (`0.0.0.0` in IPv4, `::` in IPv6), it is + /// left to the implementation to decide which network interface(s) to + /// bind to. If the port is zero, the socket will be bound to a random + /// free port. + /// + /// # Typical errors + /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) + /// - `invalid-state`: The socket is already bound. (EINVAL) + /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) + /// - `address-in-use`: Address is already in use. (EADDRINUSE) + /// - `address-not-bindable`: `local-address` is not an address that can be bound to. (EADDRNOTAVAIL) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + bind: func(local-address: ip-socket-address) -> result<_, error-code>; + /// Associate this socket with a specific peer address. + /// + /// On success, the `remote-address` of the socket is updated. + /// The `local-address` may be updated as well, based on the best network + /// path to `remote-address`. If the socket was not already explicitly + /// bound, this function will implicitly bind the socket to a random + /// free port. + /// + /// When a UDP socket is "connected", the `send` and `receive` methods + /// are limited to communicating with that peer only: + /// - `send` can only be used to send to this destination. + /// - `receive` will only return datagrams sent from the provided `remote-address`. + /// + /// The name "connect" was kept to align with the existing POSIX + /// terminology. Other than that, this function only changes the local + /// socket configuration and does not generate any network traffic. + /// The peer is not aware of this "connection". + /// + /// This method may be called multiple times on the same socket to change + /// its association, but only the most recent one will be effective. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) + /// + /// # Implementors note + /// If the socket is already connected, some platforms (e.g. Linux) + /// require a disconnect before connecting to a different peer address. + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + connect: func(remote-address: ip-socket-address) -> result<_, error-code>; + /// Dissociate this socket from its peer address. + /// + /// After calling this method, `send` & `receive` are free to communicate + /// with any remote address again. + /// + /// The POSIX equivalent of this is calling `connect` with an `AF_UNSPEC` address. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not connected. + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + disconnect: func() -> result<_, error-code>; + /// Send a message on the socket to a particular peer. + /// + /// If the socket is connected, the peer address may be left empty. In + /// that case this is equivalent to `send` in POSIX. Otherwise it is + /// equivalent to `sendto`. + /// + /// Additionally, if the socket is connected, a `remote-address` argument + /// _may_ be provided but then it must be identical to the address + /// passed to `connect`. + /// + /// If the socket has not been explicitly bound, it will be + /// implicitly bound to a random free port. + /// + /// Implementations may trap if the `data` length exceeds 64 KiB. + /// + /// # Typical errors + /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) + /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) + /// - `invalid-argument`: The socket is in "connected" mode and `remote-address` is `some` value that does not match the address passed to `connect`. (EISCONN) + /// - `invalid-argument`: The socket is not "connected" and no value for `remote-address` was provided. (EDESTADDRREQ) + /// - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `connection-refused`: The connection was refused. (ECONNREFUSED) + /// - `datagram-too-large`: The datagram is too large. (EMSGSIZE) + /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) + /// + /// # Implementors note + /// WASI requires `send` to perform an implicit bind if the socket + /// has not been bound. Not all platforms (notably Windows) exhibit + /// this behavior natively. On such platforms, the WASI implementation + /// should emulate it by performing the bind if the guest has not + /// already done so. + /// + /// # References + /// - + /// - + /// - + /// - + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + send: async func(data: list, remote-address: option) -> result<_, error-code>; + /// Receive a message on the socket. + /// + /// On success, the return value contains a tuple of the received data + /// and the address of the sender. Theoretical maximum length of the + /// data is 64 KiB. Though in practice, it will typically be less than + /// 1500 bytes. + /// + /// If the socket is connected, the sender address is guaranteed to + /// match the remote address passed to `connect`. + /// + /// # Typical errors + /// - `invalid-state`: The socket has not been bound yet. + /// - `remote-unreachable`: The remote address is not reachable. (ECONNRESET, ENETRESET on Windows, EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) + /// - `connection-refused`: The connection was refused. (ECONNREFUSED) + /// + /// # References + /// - + /// - + /// - + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + receive: async func() -> result, ip-socket-address>, error-code>; + /// Get the current bound address. + /// + /// POSIX mentions: + /// > If the socket has not been bound to a local name, the value + /// > stored in the object pointed to by `address` is unspecified. + /// + /// WASI is stricter and requires `get-local-address` to return + /// `invalid-state` when the socket hasn't been bound yet. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not bound to any local address. + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + get-local-address: func() -> result; + /// Get the address the socket is currently "connected" to. + /// + /// # Typical errors + /// - `invalid-state`: The socket is not "connected" to a specific remote address. (ENOTCONN) + /// + /// # References + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + get-remote-address: func() -> result; + /// Whether this is a IPv4 or IPv6 socket. + /// + /// This is the value passed to the constructor. + /// + /// Equivalent to the SO_DOMAIN socket option. + @since(version = 0.3.0-rc-2026-03-15) + get-address-family: func() -> ip-address-family; + /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The TTL value must be 1 or higher. + @since(version = 0.3.0-rc-2026-03-15) + get-unicast-hop-limit: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-unicast-hop-limit: func(value: u8) -> result<_, error-code>; + /// Kernel buffer space reserved for sending/receiving on this socket. + /// Implementations usually treat this as a cap the buffer can grow to, + /// rather than allocating the full amount immediately. + /// + /// If the provided value is 0, an `invalid-argument` error is returned. + /// All other values are accepted without error, but may be + /// clamped or rounded. As a result, the value read back from + /// this setting may differ from the value that was set. + /// + /// Equivalent to the SO_RCVBUF and SO_SNDBUF socket options. + /// + /// # Typical errors + /// - `invalid-argument`: (set) The provided value was 0. + @since(version = 0.3.0-rc-2026-03-15) + get-receive-buffer-size: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-receive-buffer-size: func(value: u64) -> result<_, error-code>; + @since(version = 0.3.0-rc-2026-03-15) + get-send-buffer-size: func() -> result; + @since(version = 0.3.0-rc-2026-03-15) + set-send-buffer-size: func(value: u64) -> result<_, error-code>; + } +} + +@since(version = 0.3.0-rc-2026-03-15) +interface ip-name-lookup { + @since(version = 0.3.0-rc-2026-03-15) + use types.{ip-address}; + + /// Lookup error codes. + @since(version = 0.3.0-rc-2026-03-15) + variant error-code { + /// Access denied. + /// + /// POSIX equivalent: EACCES, EPERM + access-denied, + /// `name` is a syntactically invalid domain name or IP address. + /// + /// POSIX equivalent: EINVAL + invalid-argument, + /// Name does not exist or has no suitable associated IP addresses. + /// + /// POSIX equivalent: EAI_NONAME, EAI_NODATA, EAI_ADDRFAMILY + name-unresolvable, + /// A temporary failure in name resolution occurred. + /// + /// POSIX equivalent: EAI_AGAIN + temporary-resolver-failure, + /// A permanent failure in name resolution occurred. + /// + /// POSIX equivalent: EAI_FAIL + permanent-resolver-failure, + /// A catch-all for errors not captured by the existing variants. + /// Implementations can use this to extend the error type without + /// breaking existing code. + other(option), + } + + /// Resolve an internet host name to a list of IP addresses. + /// + /// Unicode domain names are automatically converted to ASCII using IDNA + /// encoding. If the input is an IP address string, the address is parsed + /// and returned as-is without making any external requests. + /// + /// See the wasi-socket proposal README.md for a comparison with getaddrinfo. + /// + /// The results are returned in connection order preference. + /// + /// This function never succeeds with 0 results. It either fails or succeeds + /// with at least one address. Additionally, this function never returns + /// IPv4-mapped IPv6 addresses. + /// + /// # References: + /// - + /// - + /// - + /// - + @since(version = 0.3.0-rc-2026-03-15) + resolve-addresses: async func(name: string) -> result, error-code>; +} + +@since(version = 0.3.0-rc-2026-03-15) +world imports { + @since(version = 0.3.0-rc-2026-03-15) + import wasi:clocks/types@0.3.0-rc-2026-03-15; + @since(version = 0.3.0-rc-2026-03-15) + import types; + @since(version = 0.3.0-rc-2026-03-15) + import ip-name-lookup; +} diff --git a/examples/sdk/pkg/wit/world.wit b/examples/sdk/pkg/wit/world.wit new file mode 100644 index 0000000..b3f6f5a --- /dev/null +++ b/examples/sdk/pkg/wit/world.wit @@ -0,0 +1,6 @@ +package example:sdk; + +world test { + include wasi:cli/command@0.3.0-rc-2026-03-15; + include wasi:sockets/imports@0.3.0-rc-2026-03-15; +} \ No newline at end of file diff --git a/examples/wasip1/README.md b/examples/wasip1/README.md index 80c7ab4..40cbfd4 100644 --- a/examples/wasip1/README.md +++ b/examples/wasip1/README.md @@ -5,10 +5,11 @@ ### Prerequisites - [**componentize-go**](https://github.com/bytecodealliance/componentize-go) - Latest version -- [**go**](https://go.dev/dl/) - v1.25+ -- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v43.0.0 +- [**go**](https://go.dev/dl/) - v1.25.9 +- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v44.0.1 ### Run ```sh make run +``` \ No newline at end of file diff --git a/examples/wasip2/README.md b/examples/wasip2/README.md index 9cf7df6..e42a665 100644 --- a/examples/wasip2/README.md +++ b/examples/wasip2/README.md @@ -5,8 +5,8 @@ ### Prerequisites - [**componentize-go**](https://github.com/bytecodealliance/componentize-go) - Latest version -- [**go**](https://go.dev/dl/) - v1.25+ -- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v43.0.0 +- [**go**](https://go.dev/dl/) - v1.25.9 +- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v44.0.1 ### Run diff --git a/examples/wasip3/README.md b/examples/wasip3/README.md index 16f7f50..9e8ac7b 100644 --- a/examples/wasip3/README.md +++ b/examples/wasip3/README.md @@ -19,7 +19,7 @@ switch to the upstream releases. ### Prerequisites - [**componentize-go**](https://github.com/bytecodealliance/componentize-go) - Latest version -- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v43.0.0 +- [**wasmtime**](https://github.com/bytecodealliance/wasmtime) - v44.0.1 ### Build and Run diff --git a/tests/src/lib.rs b/tests/src/lib.rs index 8997362..5873c95 100644 --- a/tests/src/lib.rs +++ b/tests/src/lib.rs @@ -414,4 +414,59 @@ mod tests { .expect("app failed to run"); Ok(()) } + + // This test is more verbose because it uses unique componentize-go and wasmtime + // options that didn't make sense to abstract. + #[tokio::test] + async fn example_sdk() -> Result<()> { + let cwd = env::current_dir()?; + let app_dir = cwd + .parent() + .unwrap() + .join("examples") + .join("sdk") + .join("component"); + + // Build component + let build_output = Command::new(COMPONENTIZE_GO_PATH.as_path()) + .arg("build") + .current_dir(&app_dir) + .output()?; + if !build_output.status.success() { + return Err(anyhow!( + "failed to build application \"{}\": {}", + app_dir.display(), + String::from_utf8_lossy(&build_output.stderr) + )); + } + + // Run component + let mut child = Command::new("wasmtime") + .arg("run") + .args(["-S", "p3,inherit-network"]) + .args(["-W", "component-model-async"]) + .arg(app_dir.join("main.wasm")) + .spawn()?; + + // Send HTTP request to component + let start = std::time::Instant::now(); + loop { + match reqwest::get(format!("http://localhost:6767")).await { + Ok(r) => { + let actual = r.text().await.expect("Failed to read response"); + assert_eq!(&actual, "Hello from Go + wasi:sockets!"); + break; + } + Err(e) => { + if start.elapsed() > Duration::from_secs(5) { + return Err(anyhow!("Unable to reach the app: {e}")); + } + } + } + } + + // Kill running component + child.kill()?; + Ok(()) + } }