// validate_json — u6u 第一個 WASM 零件 // 驗證輸入字串是否為合法 JSON 格式 // // 白名單 import(TinyGo 規範): // - "os" 只用 os.Stdin / os.Stdout // - "io" io.ReadAll(os.Stdin) // - "encoding/json" json.Unmarshal / json.Marshal // // 禁止:goroutine、channel、net/*、os.Open、syscall.*、第三方 module // // 編譯指令: // tinygo build -o validate_json.wasm -target=wasi . // // 本地測試: // echo '{"json_string":"{\"key\":\"value\"}"}' | wasmtime validate_json.wasm // echo '{"json_string":"not-json"}' | wasmtime validate_json.wasm package main import ( "encoding/json" "io" "os" ) // Input 對應 input_schema type Input struct { JSONString string `json:"json_string"` } // Output 對應 output_schema type Output struct { Valid bool `json:"valid"` Error string `json:"error,omitempty"` } func main() { // 1. 讀取 stdin raw, err := io.ReadAll(os.Stdin) if err != nil { writeOutput(Output{Valid: false, Error: "failed to read stdin: " + err.Error()}) return } // 2. 解析 input JSON var input Input if err := json.Unmarshal(raw, &input); err != nil { writeOutput(Output{Valid: false, Error: "invalid input JSON: " + err.Error()}) return } // 3. 驗證 json_string 欄位 if input.JSONString == "" { writeOutput(Output{Valid: false, Error: "json_string is required"}) return } // 4. 嘗試解析 json_string var target interface{} if err := json.Unmarshal([]byte(input.JSONString), &target); err != nil { writeOutput(Output{Valid: false, Error: err.Error()}) return } writeOutput(Output{Valid: true}) } func writeOutput(out Output) { data, _ := json.Marshal(out) os.Stdout.Write(data) }