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 }