aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main.zig
blob: 73d78862197a06adb1690ab650f26d7f6e8ef437 (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
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);

    if (args.len < 2) {
        try std.fs.File.stderr().writeAll("usage: zgjq <query>\n");
        std.process.exit(1);
    }
    const query = args[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);
    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");
    }
}