Open3

「RustによるWebAssembly作成入門」をGoでやる

morixmorix

とりあえずHello Worldを

package main

import "fmt"

func main() {
	fmt.Println("Hello, World!")
}
$ GOOS=wasip1 GOARCH=wasm go build -o hello.wasm
$ wasmtime hello.wasm                           
Hello, World!
morixmorix

3.4 grepコマンドクローンを作ろう

wasmtimeにdirオプションを与えないとローカルのファイルを読み取れなかった。
サンドボックス化された実行環境だからって理由だ。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

type Cli struct {
	pattern  string
	fileName string
}

func start(cli Cli) error {
	file, err := os.Open(cli.fileName)
	if err != nil {
		return err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		line := scanner.Text()
		if strings.Contains(line, cli.pattern) {
			fmt.Println(line)
		}
	}

	return nil
}

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: go run main.go <pattern> <file_name>")
		return
	}

	cli := Cli{
		pattern:  os.Args[1],
		fileName: os.Args[2],
	}

	if err := start(cli); err != nil {
		panic(err)
	}
}
$ cat test.txt 
aaa
bbb
ccc
ddd

$ GOOS=wasip1 GOARCH=wasm go build -o my-grep.wasm

$ wasmtime --dir=$PWD my-grep.wasm bbb test.txt   
bbb