package main import ( "bytes" "encoding/json" "fmt" "io" "os" "testing" ) // PrettyJSON validates JSON and returns it with stable two-space indentation. func PrettyJSON(input []byte) ([]byte, error) { var value any dec := json.NewDecoder(bytes.NewReader(input)) dec.UseNumber() if err := dec.Decode(&value); err != nil { return nil, err } if dec.Decode(&struct{}{}) != io.EOF { return nil, fmt.Errorf("multiple JSON values") } var out bytes.Buffer enc := json.NewEncoder(&out) enc.SetIndent("", " ") enc.SetEscapeHTML(false) if err := enc.Encode(value); err != nil { return nil, err } return out.Bytes(), nil } // main reads JSON from stdin and writes pretty JSON to stdout. func main() { input, err := io.ReadAll(os.Stdin) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } output, err := PrettyJSON(input) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } if _, err := os.Stdout.Write(output); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func TestPrettyJSON(t *testing.T) { got, err := PrettyJSON([]byte(`{"name":"Ada","scores":[3,1],"active":true}`)) if err != nil { t.Fatal(err) } want := "{\n \"active\": true,\n \"name\": \"Ada\",\n \"scores\": [\n 3,\n 1\n ]\n}\n" if string(got) != want { t.Fatalf("PrettyJSON() = %q, want %q", got, want) } } func TestPrettyJSONRejectsInvalidInput(t *testing.T) { if _, err := PrettyJSON([]byte(`{"broken":`)); err == nil { t.Fatal("PrettyJSON() returned nil error for invalid JSON") } }