lib/choir/src/backends/artifact/serialization/option.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.Options) format.WriteError!void {
6 try writer.writeCount(value.values.items.len);
7 for (value.values.items) |option| {
8 try writer.writeString(option.key);
9 try writer.writeTag(std.meta.activeTag(option.value));
10 switch (option.value) {
11 .flag => |flag| try writer.writeBool(flag),
12 .signed => |signed| try writer.writeInt(i64, signed),
13 .unsigned => |unsigned| try writer.writeInt(u64, unsigned),
14 .text => |text| try writer.writeString(text),
15 .bytes => |bytes| try writer.writeBlob(bytes),
16 }
17 }
18 }
19
20 pub fn readInto(reader: *format.Reader, value: *artifact.Options) (format.Error || std.mem.Allocator.Error)!void {
21 const count = try reader.readCount();
22 for (0..count) |_| {
23 const key = try reader.readString();
24 const option_value: artifact.OptionValue = switch (try reader.readTag(artifact.OptionValueTag)) {
25 .flag => .{ .flag = try reader.readBool() },
26 .signed => .{ .signed = try reader.readInt(i64) },
27 .unsigned => .{ .unsigned = try reader.readInt(u64) },
28 .text => .{ .text = try reader.readString() },
29 .bytes => .{ .bytes = try reader.readBlob() },
30 };
31 try value.add(.{ .key = key, .value = option_value });
32 }
33 }