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 }