mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-17 01:06:08 +03:00
config: union type formatters
This commit is contained in:
@ -3065,6 +3065,20 @@ pub const FontStyle = union(enum) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Used by Formatter
|
||||||
|
pub fn formatEntry(self: Self, formatter: anytype) !void {
|
||||||
|
switch (self) {
|
||||||
|
.default, .false => try formatter.formatEntry(
|
||||||
|
[]const u8,
|
||||||
|
@tagName(self),
|
||||||
|
),
|
||||||
|
|
||||||
|
.name => |name| {
|
||||||
|
try formatter.formatEntry([:0]const u8, name);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
test "parseCLI" {
|
test "parseCLI" {
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
var arena = ArenaAllocator.init(testing.allocator);
|
var arena = ArenaAllocator.init(testing.allocator);
|
||||||
@ -3081,6 +3095,51 @@ pub const FontStyle = union(enum) {
|
|||||||
try p.parseCLI(alloc, "bold");
|
try p.parseCLI(alloc, "bold");
|
||||||
try testing.expectEqualStrings("bold", p.name);
|
try testing.expectEqualStrings("bold", p.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "formatConfig default" {
|
||||||
|
const testing = std.testing;
|
||||||
|
var buf = std.ArrayList(u8).init(testing.allocator);
|
||||||
|
defer buf.deinit();
|
||||||
|
|
||||||
|
var arena = ArenaAllocator.init(testing.allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
const alloc = arena.allocator();
|
||||||
|
|
||||||
|
var p: Self = .{ .default = {} };
|
||||||
|
try p.parseCLI(alloc, "default");
|
||||||
|
try p.formatEntry(formatterpkg.entryFormatter("a", buf.writer()));
|
||||||
|
try std.testing.expectEqualSlices(u8, "a = default\n", buf.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "formatConfig false" {
|
||||||
|
const testing = std.testing;
|
||||||
|
var buf = std.ArrayList(u8).init(testing.allocator);
|
||||||
|
defer buf.deinit();
|
||||||
|
|
||||||
|
var arena = ArenaAllocator.init(testing.allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
const alloc = arena.allocator();
|
||||||
|
|
||||||
|
var p: Self = .{ .default = {} };
|
||||||
|
try p.parseCLI(alloc, "false");
|
||||||
|
try p.formatEntry(formatterpkg.entryFormatter("a", buf.writer()));
|
||||||
|
try std.testing.expectEqualSlices(u8, "a = false\n", buf.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "formatConfig named" {
|
||||||
|
const testing = std.testing;
|
||||||
|
var buf = std.ArrayList(u8).init(testing.allocator);
|
||||||
|
defer buf.deinit();
|
||||||
|
|
||||||
|
var arena = ArenaAllocator.init(testing.allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
const alloc = arena.allocator();
|
||||||
|
|
||||||
|
var p: Self = .{ .default = {} };
|
||||||
|
try p.parseCLI(alloc, "bold");
|
||||||
|
try p.formatEntry(formatterpkg.entryFormatter("a", buf.writer()));
|
||||||
|
try std.testing.expectEqualSlices(u8, "a = bold\n", buf.items);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// See "link" for documentation.
|
/// See "link" for documentation.
|
||||||
|
@ -113,8 +113,10 @@ pub fn formatEntry(
|
|||||||
else => {},
|
else => {},
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO
|
.Union => if (@hasDecl(T, "formatEntry")) {
|
||||||
.Union => return,
|
try value.formatEntry(entryFormatter(name, writer));
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,34 @@ pub const Modifier = union(enum) {
|
|||||||
return try parse(input orelse return error.ValueRequired);
|
return try parse(input orelse return error.ValueRequired);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Used by config formatter
|
||||||
|
pub fn formatEntry(self: Modifier, formatter: anytype) !void {
|
||||||
|
var buf: [1024]u8 = undefined;
|
||||||
|
switch (self) {
|
||||||
|
.percent => |v| {
|
||||||
|
try formatter.formatEntry(
|
||||||
|
[]const u8,
|
||||||
|
std.fmt.bufPrint(
|
||||||
|
&buf,
|
||||||
|
"{d}%",
|
||||||
|
.{(v - 1) * 100},
|
||||||
|
) catch return error.OutOfMemory,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
.absolute => |v| {
|
||||||
|
try formatter.formatEntry(
|
||||||
|
[]const u8,
|
||||||
|
std.fmt.bufPrint(
|
||||||
|
&buf,
|
||||||
|
"{d}",
|
||||||
|
.{v},
|
||||||
|
) catch return error.OutOfMemory,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Apply a modifier to a numeric value.
|
/// Apply a modifier to a numeric value.
|
||||||
pub fn apply(self: Modifier, v: u32) u32 {
|
pub fn apply(self: Modifier, v: u32) u32 {
|
||||||
return switch (self) {
|
return switch (self) {
|
||||||
@ -140,6 +168,28 @@ pub const Modifier = union(enum) {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "formatConfig percent" {
|
||||||
|
const configpkg = @import("../../config.zig");
|
||||||
|
const testing = std.testing;
|
||||||
|
var buf = std.ArrayList(u8).init(testing.allocator);
|
||||||
|
defer buf.deinit();
|
||||||
|
|
||||||
|
const p = try parseCLI("24%");
|
||||||
|
try p.formatEntry(configpkg.entryFormatter("a", buf.writer()));
|
||||||
|
try std.testing.expectEqualSlices(u8, "a = 24%\n", buf.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "formatConfig absolute" {
|
||||||
|
const configpkg = @import("../../config.zig");
|
||||||
|
const testing = std.testing;
|
||||||
|
var buf = std.ArrayList(u8).init(testing.allocator);
|
||||||
|
defer buf.deinit();
|
||||||
|
|
||||||
|
const p = try parseCLI("-30");
|
||||||
|
try p.formatEntry(configpkg.entryFormatter("a", buf.writer()));
|
||||||
|
try std.testing.expectEqualSlices(u8, "a = -30\n", buf.items);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Key is an enum of all the available metrics keys.
|
/// Key is an enum of all the available metrics keys.
|
||||||
|
Reference in New Issue
Block a user