From 595919c76406f4665394b1eaacdb9f3c3d31e9ef Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 2 Sep 2024 21:43:39 +0200 Subject: [PATCH] feat: colorize --list-languages output --- src/list_languages.zig | 26 +++++++++++++++++--------- src/main.zig | 7 +++++-- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/list_languages.zig b/src/list_languages.zig index 47c8b2e..17dbe9b 100644 --- a/src/list_languages.zig +++ b/src/list_languages.zig @@ -2,7 +2,7 @@ const std = @import("std"); const syntax = @import("syntax"); const builtin = @import("builtin"); -pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { +pub fn list(allocator: std.mem.Allocator, writer: anytype, tty_config: std.io.tty.Config) !void { var max_language_len: usize = 0; var max_langserver_len: usize = 0; var max_formatter_len: usize = 0; @@ -32,19 +32,19 @@ pub fn list(allocator: std.mem.Allocator, writer: anytype) !void { for (syntax.FileType.file_types) |file_type| { try write_string(writer, file_type.name, max_language_len + 1); - try write_segmented(writer, file_type.extensions, ",", max_extensions_len + 1); + try write_segmented(writer, file_type.extensions, ",", max_extensions_len + 1, tty_config); if (builtin.os.tag != .windows) if (file_type.language_server) |language_server| - try write_checkmark(writer, try can_execute(allocator, bin_paths, language_server[0])); + try write_checkmark(writer, try can_execute(allocator, bin_paths, language_server[0]), tty_config); - try write_segmented(writer, file_type.language_server, " ", max_langserver_len + 1); + try write_segmented(writer, file_type.language_server, " ", max_langserver_len + 1, tty_config); if (builtin.os.tag != .windows) if (file_type.formatter) |formatter| - try write_checkmark(writer, try can_execute(allocator, bin_paths, formatter[0])); + try write_checkmark(writer, try can_execute(allocator, bin_paths, formatter[0]), tty_config); - try write_segmented(writer, file_type.formatter, " ", max_formatter_len); + try write_segmented(writer, file_type.formatter, " ", max_formatter_len, tty_config); try writer.writeAll("\n"); } } @@ -65,12 +65,19 @@ fn write_string(writer: anytype, string: []const u8, pad: usize) !void { try write_padding(writer, string.len, pad); } -fn write_checkmark(writer: anytype, value: bool) !void { - if (value) try writer.writeAll("✓") else try writer.writeAll("✘"); +fn write_checkmark(writer: anytype, success: bool, tty_config: std.io.tty.Config) !void { + try tty_config.setColor(writer, if (success) .green else .red); + if (success) try writer.writeAll("✓") else try writer.writeAll("✘"); try writer.writeAll(" "); } -fn write_segmented(writer: anytype, args_: ?[]const []const u8, sep: []const u8, pad: usize) !void { +fn write_segmented( + writer: anytype, + args_: ?[]const []const u8, + sep: []const u8, + pad: usize, + tty_config: std.io.tty.Config, +) !void { const args = args_ orelse return; var len: usize = 0; var first: bool = true; @@ -82,6 +89,7 @@ fn write_segmented(writer: anytype, args_: ?[]const []const u8, sep: []const u8, len += arg.len; try writer.writeAll(arg); } + try tty_config.setColor(writer, .reset); try write_padding(writer, len, pad); } diff --git a/src/main.zig b/src/main.zig index 733acb1..96d685d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -88,8 +88,11 @@ pub fn main() anyerror!void { if (res.args.version != 0) return std.io.getStdOut().writeAll(@embedFile("version_info")); - if (res.args.@"list-languages" != 0) - return list_languages.list(a, std.io.getStdOut().writer()); + if (res.args.@"list-languages" != 0) { + const stdout = std.io.getStdOut(); + const tty_config = std.io.tty.detectConfig(stdout); + return list_languages.list(a, stdout.writer(), tty_config); + } if (builtin.os.tag != .windows) if (std.posix.getenv("JITDEBUG")) |_| thespian.install_debugger();