cli_output.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. CLI output helpers for data_modules.
  5. All CLI tools should emit JSON payloads via these helpers.
  6. """
  7. from __future__ import annotations
  8. import json
  9. from dataclasses import dataclass
  10. from typing import Any, Dict, Optional
  11. @dataclass
  12. class ErrorPayload:
  13. code: str
  14. message: str
  15. suggestion: Optional[str] = None
  16. details: Optional[Dict[str, Any]] = None
  17. def build_success(data: Any = None, message: str = "ok", warnings: Optional[list] = None) -> Dict[str, Any]:
  18. payload: Dict[str, Any] = {
  19. "status": "success",
  20. "message": message,
  21. }
  22. if data is not None:
  23. payload["data"] = data
  24. if warnings:
  25. payload["warnings"] = warnings
  26. return payload
  27. def build_error(
  28. code: str,
  29. message: str,
  30. suggestion: Optional[str] = None,
  31. details: Optional[Dict[str, Any]] = None,
  32. ) -> Dict[str, Any]:
  33. error: Dict[str, Any] = {
  34. "code": code,
  35. "message": message,
  36. }
  37. if suggestion:
  38. error["suggestion"] = suggestion
  39. if details:
  40. error["details"] = details
  41. return {
  42. "status": "error",
  43. "error": error,
  44. }
  45. def print_json(payload: Dict[str, Any]) -> None:
  46. print(json.dumps(payload, ensure_ascii=False))
  47. def print_success(data: Any = None, message: str = "ok", warnings: Optional[list] = None) -> None:
  48. print_json(build_success(data=data, message=message, warnings=warnings))
  49. def print_error(
  50. code: str,
  51. message: str,
  52. suggestion: Optional[str] = None,
  53. details: Optional[Dict[str, Any]] = None,
  54. ) -> None:
  55. print_json(build_error(code=code, message=message, suggestion=suggestion, details=details))