...
1 package main
2
3 import (
4 "context"
5 _ "embed"
6 "errors"
7 "flag"
8 "fmt"
9 "log"
10 "strconv"
11
12 "github.com/tetratelabs/wazero"
13 "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
14 )
15
16
17
18
19
20
21 var addWasm []byte
22
23
24
25
26
27
28 func main() {
29
30 flag.Parse()
31
32
33 ctx := context.Background()
34
35
36 r := wazero.NewRuntime(ctx)
37 defer r.Close(ctx)
38
39
40
41 wasi_snapshot_preview1.MustInstantiate(ctx, r)
42
43
44
45 mod, err := r.Instantiate(ctx, addWasm)
46 if err != nil {
47 log.Panicf("failed to instantiate module: %v", err)
48 }
49
50
51 x, y, err := readTwoArgs(flag.Arg(0), flag.Arg(1))
52 if err != nil {
53 log.Panicf("failed to read arguments: %v", err)
54 }
55
56
57 add := mod.ExportedFunction("add")
58 results, err := add.Call(ctx, x, y)
59 if err != nil {
60 log.Panicf("failed to call add: %v", err)
61 }
62
63 fmt.Printf("%d + %d = %d\n", x, y, results[0])
64 }
65
66 func readTwoArgs(xs, ys string) (uint64, uint64, error) {
67 if xs == "" || ys == "" {
68 return 0, 0, errors.New("must specify two command line arguments")
69 }
70
71 x, err := strconv.ParseUint(xs, 10, 64)
72 if err != nil {
73 return 0, 0, fmt.Errorf("argument X: %v", err)
74 }
75
76 y, err := strconv.ParseUint(ys, 10, 64)
77 if err != nil {
78 return 0, 0, fmt.Errorf("argument Y: %v", err)
79 }
80
81 return x, y, nil
82 }
83
View as plain text