aboutsummaryrefslogtreecommitdiff
path: root/src/log.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/log.zig')
-rw-r--r--src/log.zig56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/log.zig b/src/log.zig
new file mode 100644
index 0000000..9d2b444
--- /dev/null
+++ b/src/log.zig
@@ -0,0 +1,56 @@
+const std = @import("std");
+
+const ansi = @import("ansi.zig");
+
+var log_buffer: [1024]u8 = undefined;
+var writer_stderr = std.fs.File.stderr().writer(&log_buffer);
+const stderr = &writer_stderr.interface;
+var log_lock = std.Thread.Mutex{};
+
+pub fn handler(
+ comptime message_level: std.log.Level,
+ comptime scope: @TypeOf(.enum_literal),
+ comptime format: []const u8,
+ args: anytype,
+) void {
+ log_lock.lock();
+ defer log_lock.unlock();
+ defer stderr.flush() catch unreachable;
+
+ const color = switch (message_level) {
+ .err => .red,
+ .warn => .yellow,
+ .info => .blue,
+ .debug => .magenta,
+ };
+
+ stderr.print(
+ "{f}{f}",
+ .{
+ ansi.ClearLine {},
+ ansi.Styled {
+ .text = " " ++ (comptime message_level.asText()) ++ " ",
+ .bg = color,
+ .bold = true,
+ },
+ },
+ ) catch unreachable;
+
+ if (scope != .default) {
+ stderr.print(
+ "{f}",
+ .{
+ ansi.Styled {
+ .text = " " ++ @tagName(scope) ++ " ",
+ .bg = .gray,
+ .fg = .black,
+ .italic = true,
+ },
+ },
+ ) catch unreachable;
+ }
+
+ stderr.writeByte(' ') catch unreachable;
+ stderr.print(format, args) catch unreachable;
+ stderr.writeAll("\n") catch unreachable;
+}