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

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const tracy = @import("../../root.zig");
 3 const scalar = @import("scalar.zig");
 4 const types = @import("types.zig");
 5 
 6 pub fn parse(args: []const []const u8) !types.FrameArgs {
 7     if (args.len == 0) return error.InvalidArguments;
 8     var parsed = types.FrameArgs{ .path = args[0] };
 9     var index: usize = 1;
10     while (index < args.len) : (index += 1) {
11         if (std.mem.eql(u8, args[index], "--format")) {
12             index += 1;
13             if (index >= args.len) return error.InvalidArguments;
14             if (std.mem.eql(u8, args[index], "text")) {
15                 parsed.format = .text;
16             } else if (std.mem.eql(u8, args[index], "jsonl")) {
17                 parsed.format = .jsonl;
18             } else {
19                 return error.UnsupportedFormat;
20             }
21         } else if (std.mem.eql(u8, args[index], "--top")) {
22             index += 1;
23             if (index >= args.len) return error.InvalidArguments;
24             parsed.options.top = try scalar.parsePositiveUsize(args[index]);
25         } else if (std.mem.eql(u8, args[index], "--sort")) {
26             index += 1;
27             if (index >= args.len) return error.InvalidArguments;
28             parsed.options.sort = tracy.frame.Sort.fromName(args[index]) orelse
29                 return error.UnsupportedSort;
30         } else if (std.mem.eql(u8, args[index], "--min-frame-ns")) {
31             index += 1;
32             if (index >= args.len) return error.InvalidArguments;
33             parsed.options.min_frame_ns = try scalar.parseU64(args[index]);
34         } else if (std.mem.eql(u8, args[index], "--budget-ns")) {
35             index += 1;
36             if (index >= args.len) return error.InvalidArguments;
37             parsed.options.budget_ns = try scalar.parsePositiveU64(args[index]);
38         } else if (std.mem.eql(u8, args[index], "--set")) {
39             index += 1;
40             if (index >= args.len) return error.InvalidArguments;
41             parsed.options.set = args[index];
42         } else {
43             return error.UnknownArgument;
44         }
45     }
46     return parsed;
47 }
48 
49 test "frame args parse filters and sort" {
50     const parsed = try parse(&.{
51         "events.jsonl",
52         "--format",
53         "jsonl",
54         "--top",
55         "12",
56         "--sort",
57         "mean",
58         "--min-frame-ns",
59         "100",
60         "--budget-ns",
61         "80",
62         "--set",
63         "main",
64     });
65     try std.testing.expectEqualStrings("events.jsonl", parsed.path);
66     try std.testing.expectEqual(types.Format.jsonl, parsed.format);
67     try std.testing.expectEqual(@as(usize, 12), parsed.options.top);
68     try std.testing.expectEqual(tracy.frame.Sort.mean, parsed.options.sort);
69     try std.testing.expectEqual(@as(u64, 100), parsed.options.min_frame_ns);
70     try std.testing.expectEqual(@as(?u64, 80), parsed.options.budget_ns);
71     try std.testing.expectEqualStrings("main", parsed.options.set.?);
72 }
73 
74 test "frame args reject a zero budget" {
75     try std.testing.expectError(
76         error.InvalidArguments,
77         parse(&.{ "events.jsonl", "--budget-ns", "0" }),
78     );
79 }