85 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Zig
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Zig
		
	
	
	
	
	
const serial = @import("serial.zig");
 | 
						|
const fmt = @import("std").fmt;
 | 
						|
 | 
						|
pub const Level = enum {
 | 
						|
    INFO,
 | 
						|
    DEBUG,
 | 
						|
    WARNING,
 | 
						|
    ERROR,
 | 
						|
};
 | 
						|
 | 
						|
fn logCallback(context: void, str: []const u8) anyerror!void {
 | 
						|
    serial.writeBytes(str, serial.Port.COM1);
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Write a message to the log output stream with a certain logging level.
 | 
						|
///
 | 
						|
/// Arguments:
 | 
						|
///     IN comptime level: Level - The logging level to use. Determines the message prefix and whether it is filtered.
 | 
						|
///     IN comptime format: []const u8 - The message format. Uses the standard format specification options.
 | 
						|
///     IN args: var - A struct of the parameters for the format string.
 | 
						|
///
 | 
						|
pub fn log(comptime level: Level, comptime format: []const u8, args: var) void {
 | 
						|
    fmt.format({}, anyerror, logCallback, "[" ++ @tagName(level) ++ "] " ++ format, args) catch unreachable;
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Write a message to the log output stream with the INFO level.
 | 
						|
///
 | 
						|
/// Arguments:
 | 
						|
///     IN comptime format: []const u8 - The message format. Uses the standard format specification options.
 | 
						|
///     IN args: var - A struct of the parameters for the format string.
 | 
						|
///
 | 
						|
pub fn logInfo(comptime format: []const u8, args: var) void {
 | 
						|
    log(Level.INFO, format, args);
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Write a message to the log output stream with the DEBUG level.
 | 
						|
///
 | 
						|
/// Arguments:
 | 
						|
///     IN comptime format: []const u8 - The message format. Uses the standard format specification options.
 | 
						|
///     IN args: var - A struct of the parameters for the format string.
 | 
						|
///
 | 
						|
pub fn logDebug(comptime format: []const u8, args: var) void {
 | 
						|
    log(Level.DEBUG, format, args);
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Write a message to the log output stream with the WARNING level.
 | 
						|
///
 | 
						|
/// Arguments:
 | 
						|
///     IN comptime format: []const u8 - The message format. Uses the standard format specification options.
 | 
						|
///     IN args: var - A struct of the parameters for the format string.
 | 
						|
///
 | 
						|
pub fn logWarning(comptime format: []const u8, args: var) void {
 | 
						|
    log(Level.WARNING, format, args);
 | 
						|
}
 | 
						|
 | 
						|
///
 | 
						|
/// Write a message to the log output stream with the ERROR level.
 | 
						|
///
 | 
						|
/// Arguments:
 | 
						|
///     IN comptime format: []const u8 - The message format. Uses the standard format specification options.
 | 
						|
///     IN args: var - A struct of the parameters for the format string.
 | 
						|
///
 | 
						|
pub fn logError(comptime format: []const u8, args: var) void {
 | 
						|
    log(Level.ERROR, format, args);
 | 
						|
}
 | 
						|
 | 
						|
pub fn runtimeTests() void {
 | 
						|
    inline for (@typeInfo(Level).Enum.fields) |field| {
 | 
						|
        const level = @field(Level, field.name);
 | 
						|
        log(level, "Test " ++ field.name ++ " level\n", .{});
 | 
						|
        log(level, "Test " ++ field.name ++ " level with args {}, {}\n", .{ "a", @as(u32, 1) });
 | 
						|
        const logFn = switch (level) {
 | 
						|
            .INFO => logInfo,
 | 
						|
            .DEBUG => logDebug,
 | 
						|
            .WARNING => logWarning,
 | 
						|
            .ERROR => logError,
 | 
						|
        };
 | 
						|
        logFn("Test " ++ field.name ++ " function\n", .{});
 | 
						|
        logFn("Test " ++ field.name ++ " function with args {}, {}\n", .{ "a", @as(u32, 1) });
 | 
						|
    }
 | 
						|
}
 |