package main import ( "bytes" "encoding/json" "fmt" "io" "os" ) // Pretty validates and formats JSON using two-space indentation. func Pretty(src []byte) ([]byte, error) { src = bytes.TrimSpace(src) var out bytes.Buffer if err := json.Indent(&out, src, "", " "); err != nil { return nil, fmt.Errorf("invalid JSON: %w", err) } out.WriteByte('\n') return out.Bytes(), nil } func main() { if len(os.Args) == 2 && os.Args[1] == "--test" { runTests() return } src, err := io.ReadAll(os.Stdin) if err != nil { fail(err) } pretty, err := Pretty(src) if err != nil { fail(err) } if _, err := os.Stdout.Write(pretty); err != nil { fail(err) } } func fail(err error) { fmt.Fprintln(os.Stderr, err) os.Exit(1) } // runTests provides a couple of lightweight tests without a separate test file. func runTests() { tests := []struct { name, input, want string }{ { name: "object", input: `{"name":"Ada","active":true}`, want: "{\n \"name\": \"Ada\",\n \"active\": true\n}\n", }, { name: "nested array", input: `[1,{"items":["a","b"]}]`, want: "[\n 1,\n {\n \"items\": [\n \"a\",\n \"b\"\n ]\n }\n]\n", }, } for _, test := range tests { got, err := Pretty([]byte(test.input)) if err != nil || string(got) != test.want { fmt.Fprintf(os.Stderr, "%s failed\nwant:\n%s\ngot:\n%s\nerror: %v\n", test.name, test.want, got, err) os.Exit(1) } } if _, err := Pretty([]byte(`{"broken":}`)); err == nil { fmt.Fprintln(os.Stderr, "invalid JSON test failed") os.Exit(1) } fmt.Println("all tests passed") }