lib/choir/src/backends/artifact/serialization/payload.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const artifact = @import("../root.zig");
3 const format = @import("root.zig").format;
4
5 pub fn write(writer: *format.Writer, value: artifact.Payload) format.WriteError!void {
6 try writer.writeCount(value.debug_records.items.len);
7 for (value.debug_records.items) |record| {
8 try writer.writeString(record.name);
9 try writer.writeTag(record.kind);
10 try writer.writeBlob(record.bytes);
11 }
12 try writer.writeCount(value.buffers.items.len);
13 for (value.buffers.items) |buffer| {
14 try writer.writeString(buffer.name);
15 try writer.writeTag(buffer.format);
16 try writer.writeBlob(buffer.bytes);
17 const alignment = std.math.cast(u64, buffer.alignment) orelse return error.LimitExceeded;
18 try writer.writeInt(u64, alignment);
19 }
20 try writer.writeCount(value.text_dumps.items.len);
21 for (value.text_dumps.items) |dump| {
22 try writer.writeString(dump.name);
23 try writer.writeBlob(dump.contents);
24 }
25 }
26
27 pub fn readInto(reader: *format.Reader, value: *artifact.Payload) (format.Error || std.mem.Allocator.Error)!void {
28 const debug_count = try reader.readCount();
29 for (0..debug_count) |_| {
30 try value.addDebugRecord(.{
31 .name = try reader.readString(),
32 .kind = try reader.readTag(artifact.DebugRecordKind),
33 .bytes = try reader.readBlob(),
34 });
35 }
36 const buffer_count = try reader.readCount();
37 for (0..buffer_count) |_| {
38 const name = try reader.readString();
39 const buffer_format = try reader.readTag(artifact.BufferFormat);
40 const bytes = try reader.readBlob();
41 const alignment = std.math.cast(usize, try reader.readInt(u64)) orelse return error.LimitExceeded;
42 try value.addBuffer(.{
43 .name = name,
44 .format = buffer_format,
45 .bytes = bytes,
46 .alignment = alignment,
47 });
48 }
49 const text_count = try reader.readCount();
50 for (0..text_count) |_| {
51 try value.addTextDump(.{
52 .name = try reader.readString(),
53 .contents = try reader.readBlob(),
54 });
55 }
56 }