import argparse import json import sys from pathlib import Path from typing import Any def pretty_json(text: str) -> str: """Parse JSON and return a consistently formatted representation.""" value: Any = json.loads(text) return json.dumps(value, indent=2, ensure_ascii=False) + "\n" def run_tests() -> None: """Run a couple of lightweight checks.""" assert pretty_json('{"a":1}') == '{\n "a": 1\n}\n' assert pretty_json("[true,null]") == "[\n true,\n null\n]\n" def main() -> int: parser = argparse.ArgumentParser(description="Pretty-print JSON.") parser.add_argument("file", nargs="?", type=Path, help="JSON file; defaults to stdin") parser.add_argument("--test", action="store_true", help="run self-tests") args = parser.parse_args() if args.test: run_tests() return 0 try: text = args.file.read_text(encoding="utf-8") if args.file else sys.stdin.read() sys.stdout.write(pretty_json(text)) except (OSError, json.JSONDecodeError) as error: print(f"error: {error}", file=sys.stderr) return 1 return 0 if __name__ == "__main__": raise SystemExit(main())