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 }