diff options
| author | Danilo M. <danix@danix.xyz> | 2026-06-30 10:58:02 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-06-30 10:58:02 +0200 |
| commit | 09dddee3ebbbbbb8ed6eac74370232e76e84d7bb (patch) | |
| tree | 869a37bce74d61b9ae557c8c9366bb70b8f85dc7 /firefly_cli/output.py | |
| parent | 092e05361a534a8f35d7b551afa77004e30cf201 (diff) | |
| download | firefly-cli-09dddee3ebbbbbb8ed6eac74370232e76e84d7bb.tar.gz firefly-cli-09dddee3ebbbbbb8ed6eac74370232e76e84d7bb.zip | |
feat: output emit and envelope unwrap
Diffstat (limited to 'firefly_cli/output.py')
| -rw-r--r-- | firefly_cli/output.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/firefly_cli/output.py b/firefly_cli/output.py new file mode 100644 index 0000000..8da2b1f --- /dev/null +++ b/firefly_cli/output.py @@ -0,0 +1,37 @@ +# Copyright (C) 2026 Danilo M. <danix@danix.xyz> GPL-2.0-only +import json +import sys + +def unwrap(resp): + """Flatten Firefly's JSON:API envelope to plain id+attributes objects.""" + def flat(item): + out = {"id": item.get("id")} + out.update(item.get("attributes", {})) + return out + data = resp.get("data", resp) + if isinstance(data, list): + return [flat(i) for i in data] + if isinstance(data, dict) and "attributes" in data: + return flat(data) + return data + +def emit(data, human=False, stream=None): + stream = stream or sys.stdout + if not human: + json.dump(data, stream, indent=2, default=str) + stream.write("\n") + return + rows = data if isinstance(data, list) else [data] + if not rows: + stream.write("(no results)\n") + return + cols = list(rows[0].keys()) + widths = {c: max(len(c), *(len(str(r.get(c, ""))) for r in rows)) for c in cols} + stream.write(" ".join(c.ljust(widths[c]) for c in cols) + "\n") + for r in rows: + stream.write(" ".join(str(r.get(c, "")).ljust(widths[c]) for c in cols) + "\n") + +def emit_error(message, stream=None): + stream = stream or sys.stderr + json.dump({"error": message}, stream) + stream.write("\n") |
