lib/tracy/src/cli/args/tree.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const scalar = @import("scalar.zig");
 3 const types = @import("types.zig");
 4 
 5 pub fn parse(args: []const []const u8) !types.TreeArgs {
 6     if (args.len == 0) return error.InvalidArguments;
 7     var parsed = types.TreeArgs{ .path = args[0] };
 8     var index: usize = 1;
 9     while (index < args.len) : (index += 1) {
10         if (std.mem.eql(u8, args[index], "--format")) {
11             index += 1;
12             if (index >= args.len) return error.InvalidArguments;
13             if (std.mem.eql(u8, args[index], "text")) {
14                 parsed.format = .text;
15             } else if (std.mem.eql(u8, args[index], "jsonl")) {
16                 parsed.format = .jsonl;
17             } else {
18                 return error.UnsupportedFormat;
19             }
20         } else if (std.mem.eql(u8, args[index], "--top")) {
21             index += 1;
22             if (index >= args.len) return error.InvalidArguments;
23             parsed.options.top = try scalar.parsePositiveUsize(args[index]);
24         } else if (std.mem.eql(u8, args[index], "--max-depth")) {
25             index += 1;
26             if (index >= args.len) return error.InvalidArguments;
27             parsed.options.max_depth = try scalar.parseUsize(args[index]);
28         } else if (std.mem.eql(u8, args[index], "--min-duration-ns")) {
29             index += 1;
30             if (index >= args.len) return error.InvalidArguments;
31             parsed.options.min_duration_ns = try scalar.parseU64(args[index]);
32         } else if (std.mem.eql(u8, args[index], "--thread")) {
33             index += 1;
34             if (index >= args.len) return error.InvalidArguments;
35             parsed.options.thread = try scalar.parseU64(args[index]);
36         } else {
37             return error.UnknownArgument;
38         }
39     }
40     return parsed;
41 }
42 
43 test "tree args parse filters and format" {
44     const parsed = try parse(&.{
45         "events.jsonl",
46         "--format",
47         "jsonl",
48         "--top",
49         "12",
50         "--max-depth",
51         "3",
52         "--min-duration-ns",
53         "100",
54         "--thread",
55         "7",
56     });
57     try std.testing.expectEqualStrings("events.jsonl", parsed.path);
58     try std.testing.expectEqual(types.Format.jsonl, parsed.format);
59     try std.testing.expectEqual(@as(usize, 12), parsed.options.top);
60     try std.testing.expectEqual(@as(usize, 3), parsed.options.max_depth);
61     try std.testing.expectEqual(@as(u64, 100), parsed.options.min_duration_ns);
62     try std.testing.expectEqual(@as(?u64, 7), parsed.options.thread);
63 }