blob: b6553ddb08c1c0c89785cadc8bf64dde6c0f5b20 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
const std = @import("std");
const jq = @import("zgjq").jq;
const jv = @import("zgjq").jv;
pub fn main(init: std.process.Init) !void {
const allocator = init.gpa;
const args = try init.minimal.args.toSlice(allocator);
defer allocator.free(args);
var debug_dump_disasm = false;
var query: ?[]const u8 = null;
for (args[1..]) |arg| {
if (std.mem.eql(u8, arg, "--debug-dump-disasm")) {
debug_dump_disasm = true;
} else if (query == null) {
query = arg;
}
}
if (query == null) {
try std.Io.File.stderr().writeStreamingAll(init.io, "usage: zgjq [--debug-dump-disasm] <query>\n");
std.process.exit(1);
}
var stdin_buf: [4096]u8 = undefined;
var stdin_reader = std.Io.File.stdin().reader(init.io, &stdin_buf);
const input = try stdin_reader.interface.allocRemaining(allocator, std.Io.Limit.unlimited);
defer allocator.free(input);
const parsed = try jv.parse(allocator, input);
defer parsed.deinit();
const json = parsed.value;
var runtime = try jq.Runtime.init(allocator);
defer runtime.deinit();
try runtime.compileFromSlice(query.?);
if (debug_dump_disasm) {
var stderr_buf: [4096]u8 = undefined;
var stderr = std.Io.File.stderr().writer(init.io, &stderr_buf);
try runtime.dumpDisasm(&stderr.interface);
try stderr.interface.flush();
}
try runtime.start(json);
const stdout = std.Io.File.stdout();
while (try runtime.next()) |result| {
defer result.deinit(allocator);
const output = try jv.stringify(allocator, result);
defer allocator.free(output);
try stdout.writeStreamingAll(init.io, output);
try stdout.writeStreamingAll(init.io, "\n");
}
}
|