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 }