Skip to content

Commit 2ae8138

Browse files
feat: add encode-generic and decode-generic CLI subcommands
1 parent 01ea7d8 commit 2ae8138

2 files changed

Lines changed: 37 additions & 5 deletions

File tree

src/gcf/__main__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""Allow running as `python -m gcf`."""
2+
3+
from .cli import main
4+
5+
main()

src/gcf/cli.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,25 @@
55

66
from .decode import decode
77
from .encode import encode
8+
from .decode_generic import decode_generic
9+
from .generic import encode_generic
810
from .types import Edge, Payload, Symbol
911

1012
USAGE = """gcf - token-optimized wire format for LLM tool responses
1113
1214
Usage:
13-
gcf encode [file] Encode JSON payload to GCF (stdin if no file)
14-
gcf decode [file] Decode GCF text to JSON (stdin if no file)
15-
gcf stats [file] Compare token counts: JSON vs GCF (stdin if no file)
16-
gcf version Print version
15+
gcf encode [file] Encode JSON graph payload to GCF (stdin if no file)
16+
gcf decode [file] Decode GCF graph text to JSON (stdin if no file)
17+
gcf encode-generic [file] Encode JSON to GCF generic profile (stdin if no file)
18+
gcf decode-generic [file] Decode GCF generic text to JSON (stdin if no file)
19+
gcf stats [file] Compare token counts: JSON vs GCF (stdin if no file)
20+
gcf version Print version
1721
1822
Examples:
1923
gcf encode < payload.json
2024
gcf decode < payload.gcf
25+
echo '{"name":"Alice"}' | gcf encode-generic
26+
echo 'GCF profile=generic\\nname=Alice' | gcf decode-generic
2127
gcf stats payload.json
2228
"""
2329

@@ -37,11 +43,18 @@ def main() -> None:
3743
elif cmd == "decode":
3844
data = _read_input(file_args)
3945
_do_decode(data)
46+
elif cmd == "encode-generic":
47+
data = _read_input(file_args)
48+
_do_encode_generic(data)
49+
elif cmd == "decode-generic":
50+
data = _read_input(file_args)
51+
_do_decode_generic(data)
4052
elif cmd == "stats":
4153
data = _read_input(file_args)
4254
_do_stats(data)
4355
elif cmd == "version":
44-
print("gcf 0.1.0")
56+
from . import __version__
57+
print(f"gcf {__version__}")
4558
else:
4659
print(f"unknown command: {cmd}\n", file=sys.stderr)
4760
print(USAGE, file=sys.stderr, end="")
@@ -115,6 +128,20 @@ def _payload_to_json(p: Payload) -> str:
115128
return json.dumps(obj, indent=2)
116129

117130

131+
def _do_encode_generic(data: str) -> None:
132+
try:
133+
obj = json.loads(data)
134+
except json.JSONDecodeError as e:
135+
print(f"error: invalid JSON: {e}", file=sys.stderr)
136+
sys.exit(1)
137+
print(encode_generic(obj), end="")
138+
139+
140+
def _do_decode_generic(data: str) -> None:
141+
result = decode_generic(data)
142+
print(json.dumps(result))
143+
144+
118145
def _do_encode(data: str) -> None:
119146
try:
120147
p = _payload_from_json(data)

0 commit comments

Comments
 (0)