mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 08:16:13 +03:00
--config-file to load a config file
The config file is just CLI args one per line.
This commit is contained in:
@ -276,3 +276,54 @@ test "parseIntoField: struct with parse func" {
|
|||||||
try parseIntoField(@TypeOf(data), alloc, &data, "a", "42");
|
try parseIntoField(@TypeOf(data), alloc, &data, "a", "42");
|
||||||
try testing.expectEqual(@as([]const u8, "HELLO!"), data.a.v);
|
try testing.expectEqual(@as([]const u8, "HELLO!"), data.a.v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an interator (implements "next") that reads CLI args by line.
|
||||||
|
/// Each CLI arg is expected to be a single line. This is used to implement
|
||||||
|
/// configuration files.
|
||||||
|
pub fn LineIterator(comptime ReaderType: type) type {
|
||||||
|
return struct {
|
||||||
|
const Self = @This();
|
||||||
|
|
||||||
|
/// The maximum size a single line can be. We don't expect any
|
||||||
|
/// CLI arg to exceed this size. Can't wait to git blame this in
|
||||||
|
/// like 4 years and be wrong about this.
|
||||||
|
pub const MAX_LINE_SIZE = 4096;
|
||||||
|
|
||||||
|
r: ReaderType,
|
||||||
|
entry: [MAX_LINE_SIZE]u8 = [_]u8{ '-', '-' } ++ ([_]u8{0} ** (MAX_LINE_SIZE - 2)),
|
||||||
|
|
||||||
|
pub fn next(self: *Self) ?[]const u8 {
|
||||||
|
// TODO: detect "--" prefixed lines and give a friendlier error
|
||||||
|
const buf = self.r.readUntilDelimiterOrEof(self.entry[2..], '\n') catch {
|
||||||
|
// TODO: handle errors
|
||||||
|
unreachable;
|
||||||
|
} orelse return null;
|
||||||
|
|
||||||
|
// We need to reslice so that we include our '--' at the beginning
|
||||||
|
// of our buffer so that we can trick the CLI parser to treat it
|
||||||
|
// as CLI args.
|
||||||
|
return self.entry[0 .. buf.len + 2];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructs a LineIterator (see docs for that).
|
||||||
|
pub fn lineIterator(reader: anytype) LineIterator(@TypeOf(reader)) {
|
||||||
|
return .{ .r = reader };
|
||||||
|
}
|
||||||
|
|
||||||
|
test "LineIterator" {
|
||||||
|
const testing = std.testing;
|
||||||
|
var fbs = std.io.fixedBufferStream(
|
||||||
|
\\A
|
||||||
|
\\B
|
||||||
|
\\C
|
||||||
|
);
|
||||||
|
|
||||||
|
var iter = lineIterator(fbs.reader());
|
||||||
|
try testing.expectEqualStrings("--A", iter.next().?);
|
||||||
|
try testing.expectEqualStrings("--B", iter.next().?);
|
||||||
|
try testing.expectEqualStrings("--C", iter.next().?);
|
||||||
|
try testing.expectEqual(@as(?[]const u8, null), iter.next());
|
||||||
|
try testing.expectEqual(@as(?[]const u8, null), iter.next());
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@ const std = @import("std");
|
|||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const ArenaAllocator = std.heap.ArenaAllocator;
|
const ArenaAllocator = std.heap.ArenaAllocator;
|
||||||
|
|
||||||
|
/// Config is the main config struct. These fields map directly to the
|
||||||
|
/// CLI flag names hence we use a lot of `@""` syntax to support hyphens.
|
||||||
pub const Config = struct {
|
pub const Config = struct {
|
||||||
/// Font size
|
/// Font size
|
||||||
@"font-size": u8 = 14,
|
@"font-size": u8 = 14,
|
||||||
|
16
src/main.zig
16
src/main.zig
@ -43,6 +43,22 @@ pub fn main() !void {
|
|||||||
break :config result;
|
break :config result;
|
||||||
};
|
};
|
||||||
defer config.deinit();
|
defer config.deinit();
|
||||||
|
|
||||||
|
// Parse the config files
|
||||||
|
// TODO(mitchellh): support nesting (config-file in a config file)
|
||||||
|
// TODO(mitchellh): detect cycles when nesting
|
||||||
|
if (config.@"config-file".list.items.len > 0) {
|
||||||
|
const cwd = std.fs.cwd();
|
||||||
|
for (config.@"config-file".list.items) |path| {
|
||||||
|
var file = try cwd.openFile(path, .{});
|
||||||
|
defer file.close();
|
||||||
|
|
||||||
|
var buf_reader = std.io.bufferedReader(file.reader());
|
||||||
|
var iter = cli_args.lineIterator(buf_reader.reader());
|
||||||
|
|
||||||
|
try cli_args.parse(Config, alloc, &config, &iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
log.info("config={}", .{config});
|
log.info("config={}", .{config});
|
||||||
|
|
||||||
// We want to log all our errors
|
// We want to log all our errors
|
||||||
|
Reference in New Issue
Block a user