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 }