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 }