lib/choir/src/backends/artifact/serialization/root.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const artifact = @import("../root.zig");
 3 
 4 pub const format = @import("format.zig");
 5 pub const metadata = @import("metadata.zig");
 6 pub const option = @import("option.zig");
 7 pub const linkage = @import("linkage.zig");
 8 pub const payload = @import("payload.zig");
 9 pub const verification = @import("verification.zig");
10 
11 pub const magic = format.magic;
12 pub const format_version = format.version;
13 pub const SerializeError = format.WriteError;
14 pub const DeserializeError = format.Error || std.mem.Allocator.Error;
15 
16 pub fn serialize(allocator: std.mem.Allocator, value: *const artifact.Artifact) SerializeError![]u8 {
17     var writer = format.Writer.init(allocator);
18     errdefer writer.deinit();
19     try writer.writeRaw(format.magic);
20     try writer.writeInt(u32, format.version);
21     try metadata.write(&writer, value.metadata);
22     try option.write(&writer, value.options);
23     try linkage.write(&writer, value.linkage);
24     try payload.write(&writer, value.payload);
25     try verification.write(&writer, value.verification);
26     return try writer.finish();
27 }
28 
29 pub fn deserialize(allocator: std.mem.Allocator, bytes: []const u8) DeserializeError!artifact.Artifact {
30     var reader = try format.Reader.init(bytes);
31     if (!std.mem.eql(u8, try reader.readRaw(format.magic.len), format.magic)) return error.InvalidMagic;
32     if (try reader.readInt(u32) != format.version) return error.UnsupportedVersion;
33 
34     var decoded_metadata = try metadata.read(allocator, &reader);
35     defer decoded_metadata.deinit();
36     var value = try artifact.Artifact.init(allocator, decoded_metadata.value);
37     errdefer value.deinit();
38     try option.readInto(&reader, &value.options);
39     try linkage.readInto(&reader, &value.linkage);
40     try payload.readInto(&reader, &value.payload);
41     try verification.readInto(&reader, allocator, &value.verification);
42     if (!reader.atEnd()) return error.TrailingBytes;
43     return value;
44 }