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 }