53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from typing import Any
|
|
|
|
from rich.console import Console
|
|
from rich.table import Table
|
|
|
|
console = Console()
|
|
|
|
|
|
def output(
|
|
data: Any,
|
|
*,
|
|
action: str = "",
|
|
json_mode: bool = False,
|
|
) -> None:
|
|
if json_mode:
|
|
envelope: dict[str, Any] = {"ok": True, "action": action, "data": data, "error": None}
|
|
json.dump(envelope, sys.stdout, indent=2, default=str)
|
|
sys.stdout.write("\n")
|
|
return
|
|
if isinstance(data, list) and data and isinstance(data[0], dict):
|
|
table = Table()
|
|
for key in data[0]:
|
|
table.add_column(key.replace("_", " ").title())
|
|
for row in data:
|
|
table.add_row(*[str(v) for v in row.values()])
|
|
console.print(table)
|
|
elif isinstance(data, dict):
|
|
for key, value in data.items():
|
|
console.print(f"[bold]{key}:[/bold] {value}")
|
|
else:
|
|
console.print(str(data))
|
|
|
|
|
|
def output_error(message: str, *, hint: str = "", json_mode: bool = False, exit_code: int = 1) -> None:
|
|
if json_mode:
|
|
envelope: dict[str, Any] = {
|
|
"ok": False,
|
|
"action": "",
|
|
"data": None,
|
|
"error": {"message": message, "hint": hint},
|
|
}
|
|
json.dump(envelope, sys.stdout, indent=2, default=str)
|
|
sys.stdout.write("\n")
|
|
raise SystemExit(exit_code)
|
|
console.print(f"[red]Error: {message}[/red]")
|
|
if hint:
|
|
console.print(f"[yellow]Hint: {hint}[/yellow]")
|
|
raise SystemExit(exit_code)
|