view doodle/core/logging.d @ 105:7abaf5c3959f

Merge
author David Bryant <bagnose@gmail.com>
date Sun, 20 Feb 2011 22:27:06 +1030
parents ab745d8b10e5 523269b36711
children
line wrap: on
line source

module doodle.core.logging;

private {
    import std.stdio;
    import std.typecons;
    import std.traits;
}

public {
    void trace(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.TRACE,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
    }

    void info(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.INFO,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
    }

    void message(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.MESSAGE,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
    }

    void warning(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.WARNING,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
    }

    void error(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.ERROR,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
    }

    void fatal(string file = __FILE__, int line = __LINE__, S...)(S args) {
        static assert(S.length > 0);
        static assert(isSomeString!(S[0]));
        log(Severity.FATAL,
            std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, std.string.format(args)));
        assert(0);
    }
}

private {
    enum Severity {
        TRACE,
        INFO,
        MESSAGE,
        WARNING,
        ERROR,
        FATAL
    };

    string severityString(in Severity s) {
        switch (s) {
        case Severity.TRACE:
            return modifierString(Modifier.DIM) ~ fgColorString(Color.CYAN);
        case Severity.INFO:
            return modifierString(Modifier.UNDERLINE) ~ fgColorString(Color.GREEN);
        case Severity.MESSAGE:
            return fgColorString(Color.YELLOW);
        case Severity.WARNING:
            return modifierString(Modifier.BRIGHT) ~ fgColorString(Color.MAGENTA);
        case Severity.ERROR:
            return modifierString(Modifier.BRIGHT) ~ fgColorString(Color.RED);
        case Severity.FATAL:
            return modifierString(Modifier.BRIGHT) ~ bgColorString(Color.RED) ~ fgColorString(Color.WHITE);
        default:
            assert(0);
        }
        assert(0);
    }

    void log(in Severity severity, in string message) {
        writeln(severityString(severity), message, modifierString(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 modifierString(in Modifier m) { return std.string.format("\033[%dm", 0 + m); }
    string fgColorString(in Color c)     { return std.string.format("\033[%dm", 30 + c); }
    string bgColorString(in Color c)     { return std.string.format("\033[%dm", 40 + c); }

    private string right(in string str, in int n) {
        auto pos = str.length < n ? 0 : str.length - n;
        return str[pos..$];
    }
}