lib/tracy/src/record.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const event = @import("event.zig");
 3 const transport = @import("transport.zig");
 4 
 5 pub const Parsed = union(enum) {
 6     event: event.Parsed,
 7     flight: transport.Report,
 8 
 9     pub fn deinit(self: *Parsed) void {
10         switch (self.*) {
11             .event => |*parsed| parsed.deinit(),
12             .flight => {},
13         }
14         self.* = undefined;
15     }
16 };
17 
18 pub fn parseLine(allocator: std.mem.Allocator, line: []const u8) !Parsed {
19     const parsed = event.parseLine(allocator, line) catch |err| switch (err) {
20         error.UnsupportedTraceSchema => return .{
21             .flight = try transport.parseLine(allocator, line),
22         },
23         else => return err,
24     };
25     return .{ .event = parsed };
26 }
27 
28 pub fn parseEventLine(allocator: std.mem.Allocator, line: []const u8) !?event.Parsed {
29     return switch (try parseLine(allocator, line)) {
30         .event => |parsed| parsed,
31         .flight => null,
32     };
33 }
34 
35 test "record parser dispatches events and flight reports" {
36     var event_line = std.Io.Writer.Allocating.init(std.testing.allocator);
37     defer event_line.deinit();
38     try (event.TraceEvent{ .seq = 7, .kind = .message }).writeJsonLine(&event_line.writer);
39     var parsed_event = try parseLine(std.testing.allocator, event_line.written());
40     defer parsed_event.deinit();
41     try std.testing.expectEqual(@as(u64, 7), parsed_event.event.seq);
42 
43     var report_line = std.Io.Writer.Allocating.init(std.testing.allocator);
44     defer report_line.deinit();
45     const report: transport.Report = .{
46         .policy = .overwrite_oldest,
47         .state = .accepting,
48         .capacity_bytes = 64,
49         .retained_bytes = 32,
50         .event_capacity_bytes = 16,
51         .writer_capacity_bytes = 8,
52         .observed_events = 5,
53         .stored_events = 5,
54         .retained_events = 3,
55         .overwritten_events = 2,
56         .dropped_events = 0,
57         .oversized_events = 0,
58         .partial_event_bytes = 0,
59         .discarding_oversized_event = false,
60     };
61     try report.writeJsonl(&report_line.writer);
62     var parsed_report = try parseLine(std.testing.allocator, report_line.written());
63     defer parsed_report.deinit();
64     try std.testing.expectEqual(@as(u64, 2), parsed_report.flight.overwritten_events);
65 }
66 
67 test "record parser rejects unknown schemas" {
68     try std.testing.expectError(
69         error.UnsupportedTraceSchema,
70         parseLine(std.testing.allocator, "{\"schema\":\"future/v0\"}"),
71     );
72 }