Skip to content

Commit 31bdfbc

Browse files
committed
repl mode
1 parent b5ea6fa commit 31bdfbc

1 file changed

Lines changed: 38 additions & 14 deletions

File tree

json_sql/cli.py

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from argparse import ArgumentParser
55
from csv import DictWriter
66
from sys import stdout
7+
from typing import List, Literal
78
from json import dumps
89

910

@@ -13,9 +14,23 @@ def query(code: str, workdir: Path, ctx: dict):
1314
return result
1415

1516

17+
def print_result(result: List[dict], format: Literal["json", "csv"]):
18+
if format == "json":
19+
print(dumps(result, indent=2))
20+
elif format == "csv":
21+
if len(result) == 0:
22+
print("No results to write to CSV.")
23+
else:
24+
keys = result[0].keys()
25+
writer = DictWriter(stdout, fieldnames=keys)
26+
writer.writeheader()
27+
for row in result:
28+
writer.writerow(row)
29+
30+
1631
if __name__ == "__main__":
1732
parser = ArgumentParser(description="Run SQL queries on JSON files.")
18-
parser.add_argument("code", type=str, help="SQL query to execute")
33+
parser.add_argument("--code", type=str, help="SQL query to execute", default=None)
1934
parser.add_argument(
2035
"--workdir",
2136
type=Path,
@@ -37,16 +52,25 @@ def query(code: str, workdir: Path, ctx: dict):
3752
)
3853
args = parser.parse_args()
3954

40-
result = query(code=args.code, workdir=args.workdir, ctx={})
41-
42-
if args.format == "json":
43-
print(dumps(result, indent=2))
44-
elif args.format == "csv":
45-
if len(result) == 0:
46-
print("No results to write to CSV.")
47-
else:
48-
keys = result[0].keys()
49-
writer = DictWriter(stdout, fieldnames=keys)
50-
writer.writeheader()
51-
for row in result:
52-
writer.writerow(row)
55+
if args.code:
56+
result = query(code=args.code, workdir=args.workdir, ctx={})
57+
print_result(result=result, format=args.format)
58+
else:
59+
print("JSON SQL CLI")
60+
print("Type 'exit' to quit.")
61+
while True:
62+
try:
63+
code = input("> ")
64+
if code.lower() == "exit":
65+
break
66+
result = query(code=code, workdir=args.workdir, ctx={})
67+
print_result(result=result, format=args.format)
68+
except KeyboardInterrupt:
69+
break
70+
except EOFError:
71+
break
72+
except SystemExit:
73+
break
74+
except Exception as e:
75+
print(f"Error: {e}")
76+
continue

0 commit comments

Comments
 (0)