Mercurial > projects > doodle
diff doodle/core/logging.d @ 38:452915ecd1f4
Basic logging functionality
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Sun, 27 Sep 2009 22:51:03 +0930 |
parents | |
children | 1f97022e5c6d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/core/logging.d Sun Sep 27 22:51:03 2009 +0930 @@ -0,0 +1,87 @@ +module doodle.core.logging; + +private { + import std.stdio; + import std.typecons; +} + +public { + void trace(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.TRACE, std.string.format("%s(%d): TRACE: %s", right(file, 20), line, message)); + } + void info(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.INFO, std.string.format("%s(%d): INFO: %s", right(file, 20), line, message)); + } + void message(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.MESSAGE, std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, message)); + } + void warning(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.WARNING, std.string.format("%s(%d): WARNING: %s", right(file, 20), line, message)); + } + void error(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.ERROR, std.string.format("%s(%d): ERROR: %s", right(file, 20), line, message)); + } + void fatal(string file = __FILE__, int line = __LINE__)(in string message) { + log(Severity.FATAL, std.string.format("%s(%d): FATAL: %s", right(file, 20), line, message)); + assert(0); + } +} + +private { + mixin(defineEnum!("Severity", + "TRACE", "INFO", "MESSAGE", "WARNING", "ERROR", "FATAL")); + + string mod_string(in Severity s) { + switch (s) { + case Severity.TRACE: + return modifier_string(Modifier.DIM) ~ fg_color_string(Color.CYAN); + case Severity.INFO: + return modifier_string(Modifier.UNDERLINE) ~ fg_color_string(Color.GREEN); + case Severity.MESSAGE: + return fg_color_string(Color.YELLOW); + case Severity.WARNING: + return modifier_string(Modifier.BRIGHT) ~ fg_color_string(Color.MAGENTA); + case Severity.ERROR: + return modifier_string(Modifier.BRIGHT) ~ fg_color_string(Color.RED); + case Severity.FATAL: + return modifier_string(Modifier.BRIGHT) ~ bg_color_string(Color.RED) ~ fg_color_string(Color.WHITE); + } + assert(0); + } + + void log(in Severity severity, in string message) { + write(mod_string(severity)); + write(message); + writeln(modifier_string(Modifier.RESET)); + } + + enum Modifier { + RESET = 0, + BRIGHT = 1, + DIM = 2, // does nothing in gnome-terminal + UNDERLINE = 3, // does nothing in gnome-terminal + BLINK = 5, // does nothing in gnome-terminal + REVERSE = 7, + HIDDEN = 8 + } + + enum Color { + BLACK = 0, + RED = 1, + GREEN = 2, + YELLOW = 3, + BLUE = 4, + MAGENTA = 5, + CYAN = 6, + WHITE = 7 + } + + string modifier_string(Modifier m) { return std.string.format("\033[%dm", 0 + m); } + string fg_color_string(Color c) { return std.string.format("\033[%dm", 30 + c); } + string bg_color_string(Color c) { return std.string.format("\033[%dm", 40 + c); } + + private const(char)[] right(in char[] str, int n) { + int pos = str.length < n ? 0 : str.length - n; + return str[pos..$]; + } +}