地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
at main 1.5 kB view raw
1const std = @import("std"); 2const environment = @import("environment.zig"); 3const config = &@import("./config.zig").config; 4 5pub const LOG_PATH = "log.txt"; 6 7const LogLevel = enum { 8 err, 9 info, 10 warn, 11 12 pub fn toString(level: LogLevel) []const u8 { 13 return switch (level) { 14 .err => "ERROR", 15 .info => "INFO", 16 .warn => "WARN", 17 }; 18 } 19}; 20 21const FileLogger = @This(); 22 23dir: std.fs.Dir, 24file: ?std.fs.File, 25 26pub fn init(dir: std.fs.Dir) FileLogger { 27 const file = dir.createFile(LOG_PATH, .{ .truncate = false, .read = true }) catch |err| { 28 std.log.err("Failed to create/open log file: {s}", .{@errorName(err)}); 29 return .{ .dir = dir, .file = null }; 30 }; 31 32 return .{ .dir = dir, .file = file }; 33} 34 35pub fn deinit(self: FileLogger) void { 36 if (self.file) |file| { 37 var f = file; 38 f.close(); 39 } 40} 41 42pub fn write(self: FileLogger, msg: []const u8, level: LogLevel) !void { 43 const file = if (self.file) |file| file else return error.NoLogFile; 44 45 if (try file.tryLock(.exclusive)) { 46 defer file.unlock(); 47 48 var buffer: [1024]u8 = undefined; 49 var file_writer_impl = file.writer(&buffer); 50 const file_writer = &file_writer_impl.interface; 51 try file_writer_impl.seekTo(file.getEndPos() catch 0); 52 53 try file_writer.print( 54 "({d}) {s}: {s}\n", 55 .{ std.time.timestamp(), LogLevel.toString(level), msg }, 56 ); 57 try file_writer.flush(); 58 } 59}