From 701da7746de82ad5187cd57e394e33b398c5e15c Mon Sep 17 00:00:00 2001 From: Lyssieth Date: Tue, 6 Jan 2026 08:06:21 +0200 Subject: [PATCH] Fixes everywhere --- src/args/help.zig | 84 ++++++++++++++++++++++++++--------------------- src/root.zig | 2 ++ 2 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/args/help.zig b/src/args/help.zig index 5cd4446..8037a74 100644 --- a/src/args/help.zig +++ b/src/args/help.zig @@ -8,19 +8,19 @@ const Extra = arg_lib.Extra; const niceTypeName = @import("../util/utils.zig").niceTypeName; -pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.AnyWriter) !void { +pub fn printHelp(comptime T: type, comptime name: []const u8, writer: *std.Io.Writer) !void { const info = @typeInfo(T); switch (info) { - .Struct => {}, + .@"struct" => {}, else => { - log.warn("We only support printing the help of `Struct`s, not {s}", .{@tagName(info)}); + log.warn("We only support printing the help of structs, not {s}", .{@tagName(info)}); return error.NotImplemented; }, } var hasFlags = false; - inline for (info.Struct.fields) |field| { + inline for (info.@"struct".fields) |field| { if (std.mem.eql(u8, field.name, "allocator")) { comptime continue; } @@ -32,13 +32,13 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any } var hasPositionals = false; - inline for (info.Struct.fields) |field| { + inline for (info.@"struct".fields) |field| { if (std.mem.eql(u8, field.name, "allocator")) { comptime continue; } - const valueOpaque = field.default_value orelse @panic("Missing default value for field " ++ field.name); - const valueMarker: *const field.type = @alignCast(@ptrCast(valueOpaque)); + const valueOpaque = field.default_value_ptr orelse @panic("Missing default value for field " ++ field.name); + const valueMarker: *const field.type = @ptrCast(@alignCast(valueOpaque)); const value: Extra = @field(valueMarker, "extra"); switch (value) { @@ -51,13 +51,13 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any } var hasRemainder = false; - inline for (info.Struct.fields) |field| { + inline for (info.@"struct".fields) |field| { if (std.mem.eql(u8, field.name, "allocator")) { comptime continue; } - const valueOpaque = field.default_value orelse @panic("Missing default value for field " ++ field.name); - const valueMarker: *const field.type = @alignCast(@ptrCast(valueOpaque)); + const valueOpaque = field.default_value_ptr orelse @panic("Missing default value for field " ++ field.name); + const valueMarker: *const field.type = @ptrCast(@alignCast(valueOpaque)); const value: Extra = @field(valueMarker, "extra"); switch (value) { @@ -76,13 +76,13 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any } if (hasPositionals) { - inline for (info.Struct.fields) |field| { + inline for (info.@"struct".fields) |field| { if (std.mem.eql(u8, field.name, "allocator")) { comptime continue; } - const valueOpaque = field.default_value orelse @panic("Missing default value for field " ++ field.name); - const valueMarker: *const field.type = @alignCast(@ptrCast(valueOpaque)); + const valueOpaque = field.default_value_ptr orelse @panic("Missing default value for field " ++ field.name); + const valueMarker: *const field.type = @ptrCast(@alignCast(valueOpaque)); const value: Extra = @field(valueMarker, "extra"); switch (value) { @@ -101,13 +101,13 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any try writer.print("\n", .{}); try writer.print("Legend: [optional]\n\n", .{}); - inline for (info.Struct.fields) |field| { + inline for (info.@"struct".fields) |field| { if (std.mem.eql(u8, field.name, "allocator")) { comptime continue; } - const valueOpaque = field.default_value orelse @panic("Missing default value for field " ++ field.name); - const valueMarker: *const field.type = @alignCast(@ptrCast(valueOpaque)); + const valueOpaque = field.default_value_ptr orelse @panic("Missing default value for field " ++ field.name); + const valueMarker: *const field.type = @ptrCast(@alignCast(valueOpaque)); const valueType = niceTypeName(@TypeOf(valueMarker.*.value)); const isOptional = std.mem.startsWith(u8, valueType, "?"); @@ -122,7 +122,7 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any valueType, }); - if (pos.typeHint) |typeHint| { + if (pos.type_hint) |typeHint| { try writer.print(" ({s})", .{typeHint}); } @@ -137,24 +137,24 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any flag.name, }); - if (flag.takesValue) { + if (flag.takes_value) { try writer.print("=", .{}); } if (flag.short) |short| { try writer.print(" (-{s}", .{short}); - if (flag.takesValue) { + if (flag.takes_value) { try writer.print("=", .{}); } try writer.print(")", .{}); } - if (flag.takesValue) { + if (flag.takes_value) { try writer.print(": {s}", .{valueType}); - if (flag.typeHint) |typeHint| { + if (flag.type_hint) |typeHint| { try writer.print(" ({s})", .{typeHint}); } } @@ -175,25 +175,22 @@ pub fn printHelp(comptime T: type, comptime name: []const u8, writer: std.io.Any const t = std.testing; test "empty help" { - var buf = std.ArrayList(u8).init(t.allocator); - defer buf.deinit(); - const Demo = struct {}; - try printHelp(Demo, "demo", buf.writer().any()); + var buf = std.Io.Writer.Allocating.init(t.allocator); + defer buf.deinit(); + + try printHelp(Demo, "demo", &buf.writer); try t.expectEqualStrings( \\Usage: demo \\Legend: [optional] \\ \\ - , buf.items); + , buf.written()); } test "basic help" { - var buf = std.ArrayList(u8).init(t.allocator); - defer buf.deinit(); - const Demo = struct { verbose: Marker(bool) = .{ .value = undefined, @@ -217,7 +214,14 @@ test "basic help" { }, }; - try printHelp(Demo, "demo", buf.writer().any()); + var buf = std.Io.Writer.Allocating.init(t.allocator); + defer buf.deinit(); + + try printHelp( + Demo, + "demo", + &buf.writer, + ); try t.expectEqualStrings( \\Usage: demo [flags] [...] @@ -226,28 +230,32 @@ test "basic help" { \\* --verbose (-v) \\* : string \\ - , buf.items); + , buf.written()); } test "about and type hint" { - var buf = std.ArrayList(u8).init(t.allocator); - defer buf.deinit(); - const Demo = struct { verbose: Marker(bool) = .{ .value = undefined, .extra = .{ .Flag = .{ .name = "verbose", .short = "v", - .takesValue = true, + .takes_value = true, .about = "makes the output verbose", - .typeHint = "yes/no", + .type_hint = "yes/no", } }, }, }; - try printHelp(Demo, "demo", buf.writer().any()); + var buf = std.Io.Writer.Allocating.init(t.allocator); + defer buf.deinit(); + + try printHelp( + Demo, + "demo", + &buf.writer, + ); try t.expectEqualStrings( \\Usage: demo [flags] @@ -255,5 +263,5 @@ test "about and type hint" { \\ \\* --verbose= (-v=): bool (yes/no) | makes the output verbose \\ - , buf.items); + , buf.written()); } diff --git a/src/root.zig b/src/root.zig index 73212cf..7b4d1a5 100644 --- a/src/root.zig +++ b/src/root.zig @@ -11,6 +11,8 @@ comptime { if (builtin.is_test) { std.mem.doNotOptimizeAway(args); + std.mem.doNotOptimizeAway(args.help); + std.mem.doNotOptimizeAway(args.parsers); std.mem.doNotOptimizeAway(log);