"""Tiny JSON pretty-printer. Examples: >>> pretty_json('{"name":"Ada","active":true}') '{\\n "name": "Ada",\\n "active": true\\n}' >>> pretty_json("[1, 2]") == "[\\n 1,\\n 2\\n]" True """ import argparse import json import sys from pathlib import Path from typing import Sequence def pretty_json(source: str) -> str: """Parse and format a JSON string.""" value: object = json.loads(source) return json.dumps(value, indent=2, ensure_ascii=False) def main(argv: Sequence[str] | None = None) -> int: parser = argparse.ArgumentParser(description="Pretty-print JSON.") parser.add_argument( "file", nargs="?", type=Path, help="JSON file to read; defaults to standard input", ) args = parser.parse_args(argv) try: # A positional file is convenient, while stdin supports pipelines. source = args.file.read_text(encoding="utf-8") if args.file else sys.stdin.read() print(pretty_json(source)) except (OSError, json.JSONDecodeError) as error: print(f"error: {error}", file=sys.stderr) return 1 return 0 if __name__ == "__main__": raise SystemExit(main())