package main import ( "bytes" "encoding/json" "fmt" "io" "os" "strings" "testing" ) // PrettyJSON formats JSON with stable indentation and a trailing newline. func PrettyJSON(input []byte, indent string) ([]byte, error) { var buf bytes.Buffer if err := json.Indent(&buf, input, "", indent); err != nil { return nil, err } buf.WriteByte('\n') return buf.Bytes(), nil } // prettyFromReader reads all input and returns formatted JSON text. func prettyFromReader(r io.Reader) ([]byte, error) { input, err := io.ReadAll(r) if err != nil { return nil, err } return PrettyJSON(input, " ") } func main() { out, err := prettyFromReader(os.Stdin) if err != nil { fmt.Fprintln(os.Stderr, "prettyjson:", err) os.Exit(1) } if _, err := os.Stdout.Write(out); err != nil { fmt.Fprintln(os.Stderr, "prettyjson:", err) os.Exit(1) } } func TestPrettyJSON(t *testing.T) { got, err := PrettyJSON([]byte(`{"b":[true,null],"a":1}`), " ") if err != nil { t.Fatal(err) } want := "{\n \"b\": [\n true,\n null\n ],\n \"a\": 1\n}\n" if string(got) != want { t.Fatalf("unexpected output:\n%s", got) } } func TestPrettyJSONRejectsInvalidInput(t *testing.T) { _, err := PrettyJSON([]byte(`{"broken":`), " ") if err == nil || !strings.Contains(err.Error(), "unexpected end") { t.Fatalf("expected parse error, got %v", err) } }