...
1 package main
2
3 import (
4 "context"
5 "embed"
6 "fmt"
7 "io/fs"
8 "log"
9 "os"
10
11 "github.com/tetratelabs/wazero"
12 "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
13 "github.com/tetratelabs/wazero/sys"
14 )
15
16
17
18
19 var catFS embed.FS
20
21
22
23
24 var catWasmCargoWasi []byte
25
26
27
28
29 var catWasmTinyGo []byte
30
31
32
33
34 var catWasmZig []byte
35
36
37
38
39 var catWasmZigCc []byte
40
41
42
43
44
45 func main() {
46
47 ctx := context.Background()
48
49
50 r := wazero.NewRuntime(ctx)
51 defer r.Close(ctx)
52
53
54 rooted, err := fs.Sub(catFS, "testdata")
55 if err != nil {
56 log.Panicln(err)
57 }
58
59
60 config := wazero.NewModuleConfig().
61
62 WithStdout(os.Stdout).WithStderr(os.Stderr).WithFS(rooted)
63
64
65 wasi_snapshot_preview1.MustInstantiate(ctx, r)
66
67
68
69 var catWasm []byte
70 toolchain := os.Getenv("TOOLCHAIN")
71 switch toolchain {
72 case "":
73 fallthrough
74 case "cargo-wasi":
75 catWasm = catWasmCargoWasi
76 case "tinygo":
77 catWasm = catWasmTinyGo
78 case "zig":
79 catWasm = catWasmZig
80 case "zig-cc":
81 catWasm = catWasmZigCc
82 default:
83 log.Panicln("unknown toolchain", toolchain)
84 }
85
86
87
88 if _, err = r.InstantiateWithConfig(ctx, catWasm, config.WithArgs("wasi", os.Args[1])); err != nil {
89
90
91 if exitErr, ok := err.(*sys.ExitError); ok && exitErr.ExitCode() != 0 {
92 fmt.Fprintf(os.Stderr, "exit_code: %d\n", exitErr.ExitCode())
93 } else if !ok {
94 log.Panicln(err)
95 }
96 }
97 }
98
View as plain text