╭ changed ─────────╮ │src/test/event.zig│ ╰──────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────╮ │ 3 const xit = @import("xit"); │ │ 4 const rp = xit.repo; │ │ 5 const hash = xit.hash; │ │ 6 + │ │ 7 +const event_id_size: usize = 32; │ │ 8 │ │ 9 +const AnyEvent = struct { │ │10 + id: [event_id_size * 2]u8, │ │11 + kind: []const u8, │ │12 + data: std.json.Value, │ │13 +}; │ │14 + │ │15 test "simple" { │ │16 const io = std.testing.io; │ │17 const allocator = std.testing.allocator;│ ╰────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────╮ │47 title: []const u8, │ │48 description: []const u8, │ │49 tags: []const []const u8, │ │42 - }; │ │50 + │ │51 + fn toJsonValue(issue: @This(), value_allocator: std.mem.Allocator) !std.json.Value { │ │52 + var tags = std.json.Array.init(value_allocator); │ │53 + for (issue.tags) |tag| { │ │54 + try tags.append(.{ .string = tag }); │ │55 + } │ │56 + │ │57 + var object: std.json.ObjectMap = .empty; │ │58 + try object.put(value_allocator, "title", .{ .string = issue.title }); │ │59 + try object.put(value_allocator, "description", .{ .string = issue.description });│ │60 + try object.put(value_allocator, "tags", .{ .array = tags }); │ │61 │ │44 - const id_size: usize = 32; │ │45 - const AddIssueEvent = struct { │ │46 - id: [id_size * 2]u8, │ │47 - kind: []const u8, │ │48 - data: AddIssueData, │ │62 + return .{ .object = object }; │ │63 + } │ │64 }; │ │65 │ │66 const issues_data = [_]AddIssueData{ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────╮ │ 95 // insert issues as commits in the repo │ │ 96 // │ │ 97 │ │ 98 + var arena = std.heap.ArenaAllocator.init(allocator); │ │ 99 + defer arena.deinit(); │ │100 + │ │101 var prng = std.Random.DefaultPrng.init(std.testing.random_seed); │ │102 var json: std.Io.Writer.Allocating = .init(std.testing.allocator);│ │103 defer json.deinit(); │ ╰───────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────╮ │105 for (issues_data) |issue_data| { │ │106 json.clearRetainingCapacity(); │ │107 │ │ 90 - var id_bytes: [id_size]u8 = undefined; │ │108 + var id_bytes: [event_id_size]u8 = undefined; │ │109 prng.random().bytes(&id_bytes); │ │110 │ │ 93 - const event = AddIssueEvent{ │ │111 + const event = AnyEvent{ │ │112 .id = std.fmt.bytesToHex(id_bytes, .lower), │ │113 .kind = "add-issue", │ │ 96 - .data = issue_data, │ │114 + .data = try issue_data.toJsonValue(arena.allocator()),│ │115 }; │ │116 │ │117 try std.json.Stringify.value(event, .{}, &json.writer); │ ╰───────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────╮ │124 // read and parse all of the events from the repo │ │125 // │ │126 │ │109 - var events: std.ArrayList(AddIssueEvent) = .empty; │ │127 + var events: std.ArrayList(AnyEvent) = .empty; │ │128 defer events.deinit(allocator); │ │129 │ │130 var event_strs: std.ArrayList([]const u8) = .empty;│ ╰────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │131 defer event_strs.deinit(allocator); │ │132 │ │115 - var arena = std.heap.ArenaAllocator.init(allocator); │ │116 - defer arena.deinit(); │ │117 - │ │133 const ref_haxy_meta = try repo.readRef(io, .{ .kind = .head, .name = "haxy/meta" }) orelse return error.RefNotFound;│ │134 var commit_iter = try repo.log(io, allocator, &.{ref_haxy_meta}); │ │135 defer commit_iter.deinit(); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────╮ │144 try event_strs.append(allocator, message); │ │145 } │ │146 │ │132 - // parse commit messages as JSON into struct instances. │ │147 + // parse commit messages as JSON into event values. │ │148 // add events in reverse order so the earliest event is first. │ │149 for (0..event_strs.items.len) |i| { │ │150 const event_str = event_strs.items[event_strs.items.len - i - 1];│ ╰──────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │136 - const event = try std.json.parseFromSliceLeaky(AddIssueEvent, arena.allocator(), event_str, .{});│ │151 + const event = try std.json.parseFromSliceLeaky(AnyEvent, arena.allocator(), event_str, .{}); │ │152 try events.append(allocator, event); │ │153 } │ │154 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │157 // │ │158 │ │159 const Ctx = struct { │ │145 - events: []AddIssueEvent, │ │160 + events: []AnyEvent, │ │161 │ │162 pub fn run(ctx: @This(), cursor: *Repo.DB.Cursor(.read_write)) !void {│ │163 const moment = try Repo.DB.HashMap(.read_write).init(cursor.*); │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │167 const haxy = try Repo.DB.HashMap(.read_write).init(haxy_cursor); │ │168 │ │169 // try reading the last event id that was processed in the db │ │155 - var last_event_id_maybe: ?[id_size]u8 = null; │ │170 + var last_event_id_maybe: ?[event_id_size]u8 = null; │ │171 if (try haxy.getCursor(hash.hashInt(repo_opts.hash, "last-event-id"))) |last_event_id_cursor| {│ │157 - var last_event_id_buffer: [id_size]u8 = undefined; │ │172 + var last_event_id_buffer: [event_id_size]u8 = undefined; │ │173 _ = try last_event_id_cursor.readBytes(&last_event_id_buffer); │ │174 last_event_id_maybe = last_event_id_buffer; │ │175 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯