aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main.zig
blob: 51b226246743d9238da946c1bc9f8171a1b58232 (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
const std = @import("std");
const jq = @import("zgjq").jq;
const jv = @import("zgjq").jv;

pub fn main() !void {
    const allocator = std.heap.smp_allocator;

    const args = try std.process.argsAlloc(allocator);
    defer std.process.argsFree(allocator, 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.fs.File.stderr().writeAll("usage: zgjq [--debug-dump-disasm] <query>\n");
        std.process.exit(1);
    }

    const input = try std.fs.File.stdin().readToEndAlloc(allocator, std.math.maxInt(usize));
    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 buf: [4096]u8 = undefined;
        var stderr = std.fs.File.stderr().writer(&buf);
        try runtime.dumpDisasm(&stderr.interface);
        try stderr.interface.flush();
    }

    try runtime.start(json);

    const stdout = std.fs.File.stdout();
    while (try runtime.next()) |result| {
        const output = try jv.stringify(allocator, result);
        defer allocator.free(output);
        try stdout.writeAll(output);
        try stdout.writeAll("\n");
    }
}