Skip to content

Commit 3c1fc3f

Browse files
committed
std.Build.ConfigHeaderStep: support more types
1 parent 2f58926 commit 3c1fc3f

File tree

1 file changed

+44
-32
lines changed

1 file changed

+44
-32
lines changed

lib/std/Build/ConfigHeaderStep.zig

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,39 +61,51 @@ pub fn addValues(self: *ConfigHeaderStep, values: anytype) void {
6161

6262
fn addValuesInner(self: *ConfigHeaderStep, values: anytype) !void {
6363
inline for (@typeInfo(@TypeOf(values)).Struct.fields) |field| {
64-
switch (@typeInfo(field.type)) {
65-
.Null => {
66-
try self.values.put(field.name, .undef);
67-
},
68-
.Void => {
69-
try self.values.put(field.name, .defined);
70-
},
71-
.Bool => {
72-
try self.values.put(field.name, .{ .boolean = @field(values, field.name) });
73-
},
74-
.ComptimeInt => {
75-
try self.values.put(field.name, .{ .int = @field(values, field.name) });
76-
},
77-
.EnumLiteral => {
78-
try self.values.put(field.name, .{ .ident = @tagName(@field(values, field.name)) });
79-
},
80-
.Pointer => |ptr| {
81-
switch (@typeInfo(ptr.child)) {
82-
.Array => |array| {
83-
if (ptr.size == .One and array.child == u8) {
84-
try self.values.put(field.name, .{ .string = @field(values, field.name) });
85-
continue;
86-
}
87-
},
88-
else => {},
89-
}
64+
try putValue(self, field.name, field.type, @field(values, field.name));
65+
}
66+
}
9067

91-
@compileError("unsupported ConfigHeaderStep value type: " ++
92-
@typeName(field.type));
93-
},
94-
else => @compileError("unsupported ConfigHeaderStep value type: " ++
95-
@typeName(field.type)),
96-
}
68+
fn putValue(self: *ConfigHeaderStep, field_name: []const u8, comptime T: type, v: T) !void {
69+
switch (@typeInfo(T)) {
70+
.Null => {
71+
try self.values.put(field_name, .undef);
72+
},
73+
.Void => {
74+
try self.values.put(field_name, .defined);
75+
},
76+
.Bool => {
77+
try self.values.put(field_name, .{ .boolean = v });
78+
},
79+
.Int => {
80+
try self.values.put(field_name, .{ .int = v });
81+
},
82+
.ComptimeInt => {
83+
try self.values.put(field_name, .{ .int = v });
84+
},
85+
.EnumLiteral => {
86+
try self.values.put(field_name, .{ .ident = @tagName(v) });
87+
},
88+
.Optional => {
89+
if (v) |x| {
90+
return putValue(self, field_name, @TypeOf(x), x);
91+
} else {
92+
try self.values.put(field_name, .undef);
93+
}
94+
},
95+
.Pointer => |ptr| {
96+
switch (@typeInfo(ptr.child)) {
97+
.Array => |array| {
98+
if (ptr.size == .One and array.child == u8) {
99+
try self.values.put(field_name, .{ .string = v });
100+
return;
101+
}
102+
},
103+
else => {},
104+
}
105+
106+
@compileError("unsupported ConfigHeaderStep value type: " ++ @typeName(T));
107+
},
108+
else => @compileError("unsupported ConfigHeaderStep value type: " ++ @typeName(T)),
97109
}
98110
}
99111

0 commit comments

Comments
 (0)