lib/choir/src/composition/module/serialization/variant.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const composition = @import("../../root.zig");
3 const model = @import("../root.zig");
4 const serialization = @import("root.zig");
5
6 const source = composition.source;
7 const Reader = serialization.format.Reader;
8 const Writer = serialization.format.Writer;
9
10 pub fn write(writer: *Writer, value: model.CompositionVariant) serialization.SerializeError!void {
11 try writer.writeInt(u64, value.id.value);
12 try serialization.reference.writeAddress(writer, value.choice.target);
13 try serialization.reference.writeAddress(writer, value.choice.policy);
14 try writer.writeCount(value.fragments.len);
15 for (value.fragments) |fragment_id| try writer.writeInt(u64, fragment_id.value);
16 try writer.writeCount(value.call_sites.len);
17 for (value.call_sites) |call_site| try serialization.call.write(writer, call_site);
18 }
19
20 pub fn read(
21 allocator: std.mem.Allocator,
22 reader: *Reader,
23 module: *model.CompositionModule,
24 ) serialization.DeserializeError!void {
25 const id = model.CompositionVariantId{ .value = try reader.readInt(u64) };
26 const target = try serialization.reference.readAddress(reader);
27 const policy = try serialization.reference.readAddress(reader);
28 const fragment_count = try reader.readCount();
29 const fragments = try allocator.alloc(source.FragmentId, fragment_count);
30 defer allocator.free(fragments);
31 for (fragments) |*fragment_id| fragment_id.* = .{ .value = try reader.readInt(u64) };
32
33 const call_count = try reader.readCount();
34 const call_specs = try allocator.alloc(model.CallSiteSpec, call_count);
35 var calls_initialized: usize = 0;
36 defer {
37 var index = calls_initialized;
38 while (index != 0) {
39 index -= 1;
40 serialization.call.deinitReadSpec(allocator, call_specs[index]);
41 }
42 allocator.free(call_specs);
43 }
44 for (call_specs) |*call_spec| {
45 call_spec.* = try serialization.call.read(allocator, reader);
46 calls_initialized += 1;
47 }
48 try module.addVariant(.{
49 .id = id,
50 .choice = .{ .target = target, .policy = policy },
51 .fragments = fragments,
52 .call_sites = call_specs,
53 });
54 }