70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
CLI output helpers for data_modules.
|
|
|
|
All CLI tools should emit JSON payloads via these helpers.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from dataclasses import dataclass
|
|
from typing import Any, Dict, Optional
|
|
|
|
|
|
@dataclass
|
|
class ErrorPayload:
|
|
code: str
|
|
message: str
|
|
suggestion: Optional[str] = None
|
|
details: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
def build_success(data: Any = None, message: str = "ok", warnings: Optional[list] = None) -> Dict[str, Any]:
|
|
payload: Dict[str, Any] = {
|
|
"status": "success",
|
|
"message": message,
|
|
}
|
|
if data is not None:
|
|
payload["data"] = data
|
|
if warnings:
|
|
payload["warnings"] = warnings
|
|
return payload
|
|
|
|
|
|
def build_error(
|
|
code: str,
|
|
message: str,
|
|
suggestion: Optional[str] = None,
|
|
details: Optional[Dict[str, Any]] = None,
|
|
) -> Dict[str, Any]:
|
|
error: Dict[str, Any] = {
|
|
"code": code,
|
|
"message": message,
|
|
}
|
|
if suggestion:
|
|
error["suggestion"] = suggestion
|
|
if details:
|
|
error["details"] = details
|
|
return {
|
|
"status": "error",
|
|
"error": error,
|
|
}
|
|
|
|
|
|
def print_json(payload: Dict[str, Any]) -> None:
|
|
print(json.dumps(payload, ensure_ascii=False))
|
|
|
|
|
|
def print_success(data: Any = None, message: str = "ok", warnings: Optional[list] = None) -> None:
|
|
print_json(build_success(data=data, message=message, warnings=warnings))
|
|
|
|
|
|
def print_error(
|
|
code: str,
|
|
message: str,
|
|
suggestion: Optional[str] = None,
|
|
details: Optional[Dict[str, Any]] = None,
|
|
) -> None:
|
|
print_json(build_error(code=code, message=message, suggestion=suggestion, details=details))
|