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..$];
+    }
+}