flow/src/list_languages.zig

87 lines
3.8 KiB
Zig

const std = @import("std");
const file_type_config = @import("file_type_config");
const text_manip = @import("text_manip");
const write_string = text_manip.write_string;
const write_padding = text_manip.write_padding;
const argv = @import("argv");
const builtin = @import("builtin");
const RGB = @import("color").RGB;
const bin_path = @import("bin_path");
const checkmark_width = if (builtin.os.tag != .windows) 2 else 3;
const success_mark = if (builtin.os.tag != .windows) "" else "[y]";
const fail_mark = if (builtin.os.tag != .windows) "" else "[n]";
pub fn list(allocator: std.mem.Allocator, writer: *std.io.Writer, 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;
var max_extensions_len: usize = 0;
for (file_type_config.get_all_names()) |file_type_name| {
const file_type = try file_type_config.get(file_type_name) orelse unreachable;
max_language_len = @max(max_language_len, file_type.name.len);
max_langserver_len = @max(max_langserver_len, argv.len(file_type.language_server));
max_formatter_len = @max(max_formatter_len, argv.len(file_type.formatter));
max_extensions_len = @max(max_extensions_len, argv.len(file_type.extensions));
}
try tty_config.setColor(writer, .yellow);
try write_string(writer, " Language", max_language_len + 1 + 4);
try write_string(writer, "Extensions", max_extensions_len + 1 + checkmark_width);
try write_string(writer, "Language Server", max_langserver_len + 1 + checkmark_width);
try write_string(writer, "Formatter", null);
try tty_config.setColor(writer, .reset);
try writer.writeAll("\n");
for (file_type_config.get_all_names()) |file_type_name| {
const file_type = try file_type_config.get(file_type_name) orelse unreachable;
try writer.writeAll(" ");
try setColorRgb(writer, file_type.color orelse file_type_config.default.color);
try writer.writeAll(file_type.icon orelse file_type_config.default.icon);
try tty_config.setColor(writer, .reset);
try writer.writeAll(" ");
try write_string(writer, file_type.name, max_language_len + 1);
{
const exts = file_type.extensions orelse &.{};
var ext_len: usize = 0;
for (exts, 0..) |ext, i| {
if (i > 0) {
try writer.writeByte(',');
ext_len += 1;
}
try writer.writeAll(ext);
ext_len += ext.len;
}
try tty_config.setColor(writer, .reset);
try write_padding(writer, ext_len, max_extensions_len + 1);
}
if (file_type.language_server) |language_server|
try write_checkmark(writer, bin_path.can_execute(allocator, language_server[0]), tty_config);
const len = try argv.write(writer, file_type.language_server);
try tty_config.setColor(writer, .reset);
try write_padding(writer, len, max_langserver_len + 1);
if (file_type.formatter) |formatter|
try write_checkmark(writer, bin_path.can_execute(allocator, formatter[0]), tty_config);
_ = try argv.write(writer, file_type.formatter);
try tty_config.setColor(writer, .reset);
try writer.writeAll("\n");
}
}
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(success_mark) else try writer.writeAll(fail_mark);
}
fn setColorRgb(writer: anytype, color: u24) !void {
const fg_rgb_legacy = "\x1b[38;2;{d};{d};{d}m";
const rgb = RGB.from_u24(color);
try writer.print(fg_rgb_legacy, .{ rgb.r, rgb.g, rgb.b });
}