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 }