地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
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}