authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-07-31 18:19:13 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-07-31 18:19:13 -07:00
log5bb45177a8961764ea4e0949f24513afa0bd1374
tree95b32510da2c6a3e8efa4a7bd393fd3c613f1e3c
parent41930cedb77d193e5cbfd6a2e4bed3d25262dd57

add Partial and coalescePartial


1 files changed, 29 insertions(+), 0 deletions(-)

src/lib.zig+29
......@@ -614,3 +614,32 @@ pub fn LoggingWriter(comptime T: type, comptime scope: @Type(.EnumLiteral)) type
614614 }
615615 };
616616}
617
618pub fn Partial(comptime T: type) type {
619 const fields_before = std.meta.fields(T);
620 var fields_after: [fields_before.len]std.builtin.Type.StructField = undefined;
621 inline for (fields_before, 0..) |item, i| {
622 fields_after[i] = std.builtin.Type.StructField{
623 .name = item.name,
624 .type = ?item.type,
625 .default_value = &@as(?item.type, null),
626 .is_comptime = false,
627 .alignment = @alignOf(?item.type),
628 };
629 }
630 return @Type(@unionInit(std.builtin.Type, "Struct", .{
631 .layout = .Auto,
632 .backing_integer = null,
633 .fields = &fields_after,
634 .decls = &.{},
635 .is_tuple = false,
636 }));
637}
638
639pub fn coalescePartial(comptime T: type, into: T, from: Partial(T)) T {
640 var temp = into;
641 inline for (comptime std.meta.fieldNames(T)) |name| {
642 if (@field(from, name)) |val| @field(temp, name) = val;
643 }
644 return temp;
645}