lib/tracy/src/cli/args/plot.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.PlotArgs {
7 if (args.len == 0) return error.InvalidArguments;
8 var parsed = types.PlotArgs{ .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.plots.Sort.fromName(args[index]) orelse return error.UnsupportedSort;
29 } else if (std.mem.eql(u8, args[index], "--min-samples")) {
30 index += 1;
31 if (index >= args.len) return error.InvalidArguments;
32 parsed.options.min_samples = try scalar.parseU64(args[index]);
33 } else if (std.mem.eql(u8, args[index], "--name")) {
34 index += 1;
35 if (index >= args.len) return error.InvalidArguments;
36 parsed.options.name = args[index];
37 } else {
38 return error.UnknownArgument;
39 }
40 }
41 return parsed;
42 }
43
44 test "plot args parse filters and sort" {
45 const parsed = try parse(&.{
46 "events.jsonl",
47 "--format",
48 "jsonl",
49 "--top",
50 "12",
51 "--sort",
52 "range",
53 "--min-samples",
54 "4",
55 "--name",
56 "latency.ns",
57 });
58 try std.testing.expectEqualStrings("events.jsonl", parsed.path);
59 try std.testing.expectEqual(types.Format.jsonl, parsed.format);
60 try std.testing.expectEqual(@as(usize, 12), parsed.options.top);
61 try std.testing.expectEqual(tracy.plots.Sort.range, parsed.options.sort);
62 try std.testing.expectEqual(@as(u64, 4), parsed.options.min_samples);
63 try std.testing.expectEqualStrings("latency.ns", parsed.options.name.?);
64 }