summaryrefslogtreecommitdiff
path: root/src/cli/args.zig
diff options
context:
space:
mode:
authorMitchell Hashimoto <m@mitchellh.com>2025-09-29 10:00:17 -0700
committerMitchell Hashimoto <m@mitchellh.com>2025-09-29 10:08:58 -0700
commit10316297412e9a57dbfbdc19b7fdff66e17b2a60 (patch)
tree60bdc9ccb83c0151e01673b884b88c75684b20e5 /src/cli/args.zig
parent9597cead92eaf053ff38113a54882a016bc0c40b (diff)
config: modify MouseScrollMultiplier to lean on args parsing
Diffstat (limited to 'src/cli/args.zig')
-rw-r--r--src/cli/args.zig37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/cli/args.zig b/src/cli/args.zig
index 2d2d199be..b8f393864 100644
--- a/src/cli/args.zig
+++ b/src/cli/args.zig
@@ -507,13 +507,18 @@ pub fn parseTaggedUnion(comptime T: type, alloc: Allocator, v: []const u8) !T {
fn parseStruct(comptime T: type, alloc: Allocator, v: []const u8) !T {
return switch (@typeInfo(T).@"struct".layout) {
- .auto => parseAutoStruct(T, alloc, v),
+ .auto => parseAutoStruct(T, alloc, v, null),
.@"packed" => parsePackedStruct(T, v),
else => @compileError("unsupported struct layout"),
};
}
-pub fn parseAutoStruct(comptime T: type, alloc: Allocator, v: []const u8) !T {
+pub fn parseAutoStruct(
+ comptime T: type,
+ alloc: Allocator,
+ v: []const u8,
+ default_: ?T,
+) !T {
const info = @typeInfo(T).@"struct";
comptime assert(info.layout == .auto);
@@ -573,9 +578,18 @@ pub fn parseAutoStruct(comptime T: type, alloc: Allocator, v: []const u8) !T {
// Ensure all required fields are set
inline for (info.fields, 0..) |field, i| {
if (!fields_set.isSet(i)) {
- const default_ptr = field.default_value_ptr orelse return error.InvalidValue;
- const typed_ptr: *const field.type = @alignCast(@ptrCast(default_ptr));
- @field(result, field.name) = typed_ptr.*;
+ @field(result, field.name) = default: {
+ // If we're given a default value then we inherit those.
+ // Otherwise we use the default values as specified by the
+ // struct.
+ if (default_) |default| {
+ break :default @field(default, field.name);
+ } else {
+ const default_ptr = field.default_value_ptr orelse return error.InvalidValue;
+ const typed_ptr: *const field.type = @alignCast(@ptrCast(default_ptr));
+ break :default typed_ptr.*;
+ }
+ };
}
}
@@ -1194,7 +1208,18 @@ test "parseIntoField: struct with basic fields" {
try testing.expectEqual(84, data.value.b);
try testing.expectEqual(24, data.value.c);
- // Missing require dfield
+ // Set with explicit default
+ data.value = try parseAutoStruct(
+ @TypeOf(data.value),
+ alloc,
+ "a:hello",
+ .{ .a = "oh no", .b = 42 },
+ );
+ try testing.expectEqualStrings("hello", data.value.a);
+ try testing.expectEqual(42, data.value.b);
+ try testing.expectEqual(12, data.value.c);
+
+ // Missing required field
try testing.expectError(
error.InvalidValue,
parseIntoField(@TypeOf(data), alloc, &data, "value", "a:hello"),