From 6dff92472a386d84f39c57cea19da093634b8d87 Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Sat, 3 Aug 2024 11:53:10 -0700 Subject: [PATCH] Provide iter type hint to cli.args.parse --- src/bench/codepoint-width.zig | 2 +- src/bench/grapheme-break.zig | 2 +- src/bench/page-init.zig | 2 +- src/bench/parser.zig | 2 +- src/bench/stream.zig | 2 +- src/cli/args.zig | 13 +++++++------ src/cli/crash_report.zig | 2 +- src/cli/help.zig | 2 +- src/cli/list_actions.zig | 2 +- src/cli/list_colors.zig | 2 +- src/cli/list_fonts.zig | 6 +++--- src/cli/list_keybinds.zig | 2 +- src/cli/list_themes.zig | 2 +- src/cli/show_config.zig | 2 +- src/cli/validate_config.zig | 2 +- src/config/CAPI.zig | 2 +- src/config/Config.zig | 17 +++++++++-------- src/config/Wasm.zig | 2 +- 18 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/bench/codepoint-width.zig b/src/bench/codepoint-width.zig index ce44bccb0..0201ba459 100644 --- a/src/bench/codepoint-width.zig +++ b/src/bench/codepoint-width.zig @@ -70,7 +70,7 @@ pub fn main() !void { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try cli.args.parse(Args, alloc, &args, &iter); + try cli.args.parse(Args, @TypeOf(iter), alloc, &args, &iter); } const reader = std.io.getStdIn().reader(); diff --git a/src/bench/grapheme-break.zig b/src/bench/grapheme-break.zig index bbe2171d5..04a5eb212 100644 --- a/src/bench/grapheme-break.zig +++ b/src/bench/grapheme-break.zig @@ -62,7 +62,7 @@ pub fn main() !void { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try cli.args.parse(Args, alloc, &args, &iter); + try cli.args.parse(Args, @TypeOf(iter), alloc, &args, &iter); } const reader = std.io.getStdIn().reader(); diff --git a/src/bench/page-init.zig b/src/bench/page-init.zig index e45d64fbb..f117f4cce 100644 --- a/src/bench/page-init.zig +++ b/src/bench/page-init.zig @@ -47,7 +47,7 @@ pub fn main() !void { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try cli.args.parse(Args, alloc, &args, &iter); + try cli.args.parse(Args, @TypeOf(iter), alloc, &args, &iter); } // Handle the modes that do not depend on terminal state first. diff --git a/src/bench/parser.zig b/src/bench/parser.zig index ee6c3ee94..294fc47b6 100644 --- a/src/bench/parser.zig +++ b/src/bench/parser.zig @@ -29,7 +29,7 @@ pub fn main() !void { errdefer args.deinit(); var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try cli.args.parse(Args, alloc, &args, &iter); + try cli.args.parse(Args, @TypeOf(iter), alloc, &args, &iter); break :args args; }; defer args.deinit(); diff --git a/src/bench/stream.zig b/src/bench/stream.zig index a7abb37cc..aba0b684d 100644 --- a/src/bench/stream.zig +++ b/src/bench/stream.zig @@ -86,7 +86,7 @@ pub fn main() !void { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try cli.args.parse(Args, alloc, &args, &iter); + try cli.args.parse(Args, @TypeOf(iter), alloc, &args, &iter); } const reader = std.io.getStdIn().reader(); diff --git a/src/cli/args.zig b/src/cli/args.zig index 0f21ea79b..e46fe09dc 100644 --- a/src/cli/args.zig +++ b/src/cli/args.zig @@ -38,9 +38,10 @@ pub const Error = error{ /// /// Note: If the arena is already non-null, then it will be used. In this /// case, in the case of an error some memory might be leaked into the arena. -pub fn parse(comptime T: type, alloc: Allocator, dst: *T, iter: anytype) !void { +pub fn parse(comptime T: type, comptime Iter: type, alloc: Allocator, dst: *T, iter: *Iter) !void { const info = @typeInfo(T); assert(info == .Struct); + assert(@typeInfo(Iter) == .Struct); // Make an arena for all our allocations if we support it. Otherwise, // use an allocator that always fails. If the arena is already set on @@ -357,7 +358,7 @@ test "parse: simple" { "--a=42 --b --b-f=false", ); defer iter.deinit(); - try parse(@TypeOf(data), testing.allocator, &data, &iter); + try parse(@TypeOf(data), @TypeOf(iter), testing.allocator, &data, &iter); try testing.expect(data._arena != null); try testing.expectEqualStrings("42", data.a); try testing.expect(data.b); @@ -369,7 +370,7 @@ test "parse: simple" { "--a=84", ); defer iter2.deinit(); - try parse(@TypeOf(data), testing.allocator, &data, &iter2); + try parse(@TypeOf(data), @TypeOf(iter), testing.allocator, &data, &iter2); try testing.expect(data._arena != null); try testing.expectEqualStrings("84", data.a); try testing.expect(data.b); @@ -391,7 +392,7 @@ test "parse: quoted value" { "--a=\"42\" --b=\"hello!\"", ); defer iter.deinit(); - try parse(@TypeOf(data), testing.allocator, &data, &iter); + try parse(@TypeOf(data), @TypeOf(iter), testing.allocator, &data, &iter); try testing.expectEqual(@as(u8, 42), data.a); try testing.expectEqualStrings("hello!", data.b); } @@ -411,7 +412,7 @@ test "parse: empty value resets to default" { "--a= --b=", ); defer iter.deinit(); - try parse(@TypeOf(data), testing.allocator, &data, &iter); + try parse(@TypeOf(data), @TypeOf(iter), testing.allocator, &data, &iter); try testing.expectEqual(@as(u8, 42), data.a); try testing.expect(!data.b); } @@ -433,7 +434,7 @@ test "parse: error tracking" { "--what --a=42", ); defer iter.deinit(); - try parse(@TypeOf(data), testing.allocator, &data, &iter); + try parse(@TypeOf(data), @TypeOf(iter), testing.allocator, &data, &iter); try testing.expect(data._arena != null); try testing.expectEqualStrings("42", data.a); try testing.expect(!data._errors.empty()); diff --git a/src/cli/crash_report.zig b/src/cli/crash_report.zig index 0ec6a8ce0..0b78ca3ff 100644 --- a/src/cli/crash_report.zig +++ b/src/cli/crash_report.zig @@ -35,7 +35,7 @@ pub fn run(alloc_gpa: Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } const crash_dir = try crash.defaultDir(alloc); diff --git a/src/cli/help.zig b/src/cli/help.zig index c0db37afe..e40f88025 100644 --- a/src/cli/help.zig +++ b/src/cli/help.zig @@ -25,7 +25,7 @@ pub fn run(alloc: Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } const stdout = std.io.getStdOut().writer(); diff --git a/src/cli/list_actions.zig b/src/cli/list_actions.zig index c6a5cf240..63f8ec16d 100644 --- a/src/cli/list_actions.zig +++ b/src/cli/list_actions.zig @@ -31,7 +31,7 @@ pub fn run(alloc: Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } const stdout = std.io.getStdOut().writer(); diff --git a/src/cli/list_colors.zig b/src/cli/list_colors.zig index b9a250519..695372622 100644 --- a/src/cli/list_colors.zig +++ b/src/cli/list_colors.zig @@ -24,7 +24,7 @@ pub fn run(alloc: std.mem.Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } const stdout = std.io.getStdOut().writer(); diff --git a/src/cli/list_fonts.zig b/src/cli/list_fonts.zig index f5210d9bc..a3ee32062 100644 --- a/src/cli/list_fonts.zig +++ b/src/cli/list_fonts.zig @@ -55,13 +55,13 @@ pub const Config = struct { pub fn run(alloc: Allocator) !u8 { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - return try runArgs(alloc, &iter); + return try runArgs(@TypeOf(iter), alloc, &iter); } -fn runArgs(alloc_gpa: Allocator, argsIter: anytype) !u8 { +fn runArgs(comptime Iter: type, alloc_gpa: Allocator, argsIter: *Iter) !u8 { var config: Config = .{}; defer config.deinit(); - try args.parse(Config, alloc_gpa, &config, argsIter); + try args.parse(Config, Iter, alloc_gpa, &config, argsIter); // Use an arena for all our memory allocs var arena = ArenaAllocator.init(alloc_gpa); diff --git a/src/cli/list_keybinds.zig b/src/cli/list_keybinds.zig index b12694625..e1bd8b3a0 100644 --- a/src/cli/list_keybinds.zig +++ b/src/cli/list_keybinds.zig @@ -54,7 +54,7 @@ pub fn run(alloc: Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } var config = if (opts.default) try Config.default(alloc) else try Config.load(alloc); diff --git a/src/cli/list_themes.zig b/src/cli/list_themes.zig index 4a90df1c5..5620d05b6 100644 --- a/src/cli/list_themes.zig +++ b/src/cli/list_themes.zig @@ -56,7 +56,7 @@ pub fn run(gpa_alloc: std.mem.Allocator) !u8 { { var iter = try std.process.argsWithAllocator(gpa_alloc); defer iter.deinit(); - try args.parse(Options, gpa_alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), gpa_alloc, &opts, &iter); } var arena = std.heap.ArenaAllocator.init(gpa_alloc); diff --git a/src/cli/show_config.zig b/src/cli/show_config.zig index e3f1341e8..568d0994b 100644 --- a/src/cli/show_config.zig +++ b/src/cli/show_config.zig @@ -62,7 +62,7 @@ pub fn run(alloc: Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } var config = if (opts.default) try Config.default(alloc) else try Config.load(alloc); diff --git a/src/cli/validate_config.zig b/src/cli/validate_config.zig index d6fedc544..169b66094 100644 --- a/src/cli/validate_config.zig +++ b/src/cli/validate_config.zig @@ -34,7 +34,7 @@ pub fn run(alloc: std.mem.Allocator) !u8 { { var iter = try std.process.argsWithAllocator(alloc); defer iter.deinit(); - try args.parse(Options, alloc, &opts, &iter); + try args.parse(Options, @TypeOf(iter), alloc, &opts, &iter); } const stdout = std.io.getStdOut().writer(); diff --git a/src/config/CAPI.zig b/src/config/CAPI.zig index 1949d6e91..6e62a0891 100644 --- a/src/config/CAPI.zig +++ b/src/config/CAPI.zig @@ -54,7 +54,7 @@ export fn ghostty_config_load_string( fn config_load_string_(self: *Config, str: []const u8) !void { var fbs = std.io.fixedBufferStream(str); var iter = cli.args.lineIterator(fbs.reader()); - try cli.args.parse(Config, global.alloc, self, &iter); + try cli.args.parse(Config, @TypeOf(iter), global.alloc, self, &iter); } /// Load the configuration from the default file locations. This diff --git a/src/config/Config.zig b/src/config/Config.zig index 555fa30b2..5f5d8cd7e 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2058,10 +2058,11 @@ pub fn default(alloc_gpa: Allocator) Allocator.Error!Config { /// command-line arguments, i.e. `--key=value`. pub fn loadIter( self: *Config, + comptime Iter: type, alloc: Allocator, - iter: anytype, + iter: *Iter, ) !void { - try cli.args.parse(Config, alloc, self, iter); + try cli.args.parse(Config, Iter, alloc, self, iter); } /// Load configuration from the target config file at `path`. @@ -2077,7 +2078,7 @@ pub fn loadFile(self: *Config, alloc: Allocator, path: []const u8) !void { var buf_reader = std.io.bufferedReader(file.reader()); var iter = cli.args.lineIterator(buf_reader.reader()); - try self.loadIter(alloc, &iter); + try self.loadIter(@TypeOf(iter), alloc, &iter); try self.expandPaths(std.fs.path.dirname(path).?); } @@ -2178,7 +2179,7 @@ pub fn loadCliArgs(self: *Config, alloc_gpa: Allocator) !void { // Parse the config from the CLI args var iter = try std.process.argsWithAllocator(alloc_gpa); defer iter.deinit(); - try self.loadIter(alloc_gpa, &iter); + try self.loadIter(@TypeOf(iter), alloc_gpa, &iter); // If we are not loading the default files, then we need to // replay the steps up to this point so that we can rebuild @@ -2193,7 +2194,7 @@ pub fn loadCliArgs(self: *Config, alloc_gpa: Allocator) !void { self._replay_steps.items[replay_len_start..replay_len_end], &new_config, ); - try new_config.loadIter(alloc_gpa, &it); + try new_config.loadIter(@TypeOf(it), alloc_gpa, &it); self.deinit(); self.* = new_config; } else { @@ -2271,7 +2272,7 @@ pub fn loadRecursiveFiles(self: *Config, alloc_gpa: Allocator) !void { log.info("loading config-file path={s}", .{path}); var buf_reader = std.io.bufferedReader(file.reader()); var iter = cli.args.lineIterator(buf_reader.reader()); - try self.loadIter(alloc_gpa, &iter); + try self.loadIter(@TypeOf(iter), alloc_gpa, &iter); try self.expandPaths(std.fs.path.dirname(path).?); } } @@ -2332,12 +2333,12 @@ fn loadTheme(self: *Config, theme: []const u8) !void { // Load our theme var buf_reader = std.io.bufferedReader(file.reader()); var iter = cli.args.lineIterator(buf_reader.reader()); - try new_config.loadIter(alloc_gpa, &iter); + try new_config.loadIter(@TypeOf(iter), alloc_gpa, &iter); // Replay our previous inputs so that we can override values // from the theme. var slice_it = Replay.iterator(self._replay_steps.items[0..replay_len], &new_config); - try new_config.loadIter(alloc_gpa, &slice_it); + try new_config.loadIter(@TypeOf(slice_it), alloc_gpa, &slice_it); // Success, swap our new config in and free the old. self.deinit(); diff --git a/src/config/Wasm.zig b/src/config/Wasm.zig index 90c06b63a..d8db3c13a 100644 --- a/src/config/Wasm.zig +++ b/src/config/Wasm.zig @@ -44,7 +44,7 @@ export fn config_load_string( fn config_load_string_(self: *Config, str: []const u8) !void { var fbs = std.io.fixedBufferStream(str); var iter = cli.args.lineIterator(fbs.reader()); - try cli.args.parse(Config, alloc, self, &iter); + try cli.args.parse(Config, @TypeOf(iter), alloc, self, &iter); } export fn config_finalize(self: *Config) void {