38
|
1 module doodle.core.logging;
|
|
2
|
|
3 private {
|
|
4 import std.stdio;
|
|
5 import std.typecons;
|
|
6 }
|
|
7
|
|
8 public {
|
|
9 void trace(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
10 log(Severity.TRACE, std.string.format("%s(%d): TRACE: %s", right(file, 20), line, message));
|
|
11 }
|
|
12 void info(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
13 log(Severity.INFO, std.string.format("%s(%d): INFO: %s", right(file, 20), line, message));
|
|
14 }
|
|
15 void message(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
16 log(Severity.MESSAGE, std.string.format("%s(%d): MESSAGE: %s", right(file, 20), line, message));
|
|
17 }
|
|
18 void warning(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
19 log(Severity.WARNING, std.string.format("%s(%d): WARNING: %s", right(file, 20), line, message));
|
|
20 }
|
|
21 void error(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
22 log(Severity.ERROR, std.string.format("%s(%d): ERROR: %s", right(file, 20), line, message));
|
|
23 }
|
|
24 void fatal(string file = __FILE__, int line = __LINE__)(in string message) {
|
|
25 log(Severity.FATAL, std.string.format("%s(%d): FATAL: %s", right(file, 20), line, message));
|
|
26 assert(0);
|
|
27 }
|
|
28 }
|
|
29
|
|
30 private {
|
|
31 mixin(defineEnum!("Severity",
|
|
32 "TRACE", "INFO", "MESSAGE", "WARNING", "ERROR", "FATAL"));
|
|
33
|
51
|
34 string severityString(in Severity s) {
|
38
|
35 switch (s) {
|
|
36 case Severity.TRACE:
|
48
|
37 return modifierString(Modifier.DIM) ~ fgColorString(Color.CYAN);
|
38
|
38 case Severity.INFO:
|
48
|
39 return modifierString(Modifier.UNDERLINE) ~ fgColorString(Color.GREEN);
|
38
|
40 case Severity.MESSAGE:
|
48
|
41 return fgColorString(Color.YELLOW);
|
38
|
42 case Severity.WARNING:
|
48
|
43 return modifierString(Modifier.BRIGHT) ~ fgColorString(Color.MAGENTA);
|
38
|
44 case Severity.ERROR:
|
48
|
45 return modifierString(Modifier.BRIGHT) ~ fgColorString(Color.RED);
|
38
|
46 case Severity.FATAL:
|
48
|
47 return modifierString(Modifier.BRIGHT) ~ bgColorString(Color.RED) ~ fgColorString(Color.WHITE);
|
40
|
48 default:
|
|
49 assert(0);
|
38
|
50 }
|
|
51 assert(0);
|
|
52 }
|
|
53
|
|
54 void log(in Severity severity, in string message) {
|
51
|
55 write(severityString(severity));
|
38
|
56 write(message);
|
48
|
57 writeln(modifierString(Modifier.RESET));
|
38
|
58 }
|
|
59
|
|
60 enum Modifier {
|
|
61 RESET = 0,
|
|
62 BRIGHT = 1,
|
|
63 DIM = 2, // does nothing in gnome-terminal
|
|
64 UNDERLINE = 3, // does nothing in gnome-terminal
|
|
65 BLINK = 5, // does nothing in gnome-terminal
|
|
66 REVERSE = 7,
|
|
67 HIDDEN = 8
|
|
68 }
|
|
69
|
|
70 enum Color {
|
|
71 BLACK = 0,
|
|
72 RED = 1,
|
|
73 GREEN = 2,
|
|
74 YELLOW = 3,
|
|
75 BLUE = 4,
|
|
76 MAGENTA = 5,
|
|
77 CYAN = 6,
|
|
78 WHITE = 7
|
|
79 }
|
|
80
|
51
|
81 string modifierString(in Modifier m) { return std.string.format("\033[%dm", 0 + m); }
|
|
82 string fgColorString(in Color c) { return std.string.format("\033[%dm", 30 + c); }
|
|
83 string bgColorString(in Color c) { return std.string.format("\033[%dm", 40 + c); }
|
38
|
84
|
51
|
85 private string right(in string str, in int n) {
|
38
|
86 int pos = str.length < n ? 0 : str.length - n;
|
|
87 return str[pos..$];
|
|
88 }
|
|
89 }
|