1 module dparasail.log;
2 import std.stdio;
3 import std.array : join;
4 
5 /// Log levels.
6 enum LogLevel // @suppress(dscanner.style.phobos_naming_convention)
7 {
8     LOG_OFF = 0, ///< All logging disabled.
9     LOG_ERROR = 1, ///< Logging of errors only.
10     LOG_WARNING = 3, ///< Logging of errors and warnings.
11     LOG_INFO = 4, ///< Logging of errors, warnings, and normal but significant events.
12     LOG_DEBUG = 5, ///< Logging of all except the most detailed debug events.
13     LOG_TRACE = 6 ///< All logging enabled.
14 }
15 
16 int verbose;
17 
18 /// Sets the selected log level.
19 void setLogLevel(LogLevel level)
20 {
21     verbose = cast(int)level;
22 }
23 
24 /// Gets the selected log level.
25 LogLevel getLogLevel()
26 {
27     return cast(LogLevel) verbose;
28 }
29 
30 void log(LogLevel severity, const(char)[] context, string[] contents ...)
31 {
32     final switch(severity)
33     {
34         case LogLevel.LOG_OFF:
35             return;
36         case LogLevel.LOG_ERROR:
37             stderr.writefln("[E::"~context~"] %s", contents.join);
38             return;
39         case LogLevel.LOG_WARNING:
40             stderr.writefln("[W::"~context~"] %s", contents.join);
41             return;
42         case LogLevel.LOG_INFO:
43             stderr.writefln("[I::"~context~"] %s", contents.join);
44             return;
45         case LogLevel.LOG_DEBUG:
46             stderr.writefln("[D::"~context~"] %s", contents.join);
47             return;
48         case LogLevel.LOG_TRACE:
49             stderr.writefln("[T::"~context~"] %s", contents.join);
50             return;
51     }
52 }
53 
54 
55 /**! Logs an event with severity HTS_LOG_ERROR and default context. Parameters: format, ... */
56 //#define hts_log_error(...) hts_log(HTS_LOG_ERROR, __func__, __VA_ARGS__)
57 void logError(const(char)[] ctx, string msg)
58 {
59     string open_error_color = "\x1b[0;31m";
60     string close_color      = "\x1b[0m";
61     log(LogLevel.LOG_ERROR, ctx, open_error_color, msg, close_color);
62 }
63 /**! Logs an event with severity HTS_LOG_WARNING and default context. Parameters: format, ... */
64 //#define hts_log_warning(...) hts_log(HTS_LOG_WARNING, __func__, __VA_ARGS__)
65 void logWarning(const(char)[] ctx, string msg)
66 {
67     string open_warning_color = "\x1b[0;33m";
68     string close_color        = "\x1b[0m";
69     log(LogLevel.LOG_WARNING, ctx, open_warning_color, msg, close_color);
70 }
71 
72 /**! Logs an event with severity HTS_LOG_INFO and default context. Parameters: format, ... */
73 //#define hts_log_info(...) hts_log(HTS_LOG_INFO, __func__, __VA_ARGS__)
74 void logInfo(const(char)[] ctx, string msg)
75 {
76     string open_info_color = "\x1b[0;32m";
77     string close_color     = "\x1b[0m";
78     log(LogLevel.LOG_INFO, ctx, open_info_color, msg, close_color);
79 }
80 
81 /**! Logs an event with severity HTS_LOG_DEBUG and default context. Parameters: format, ... */
82 //#define hts_log_debug(...) hts_log(HTS_LOG_DEBUG, __func__, __VA_ARGS__)
83 void logDebug(const(char)[] ctx, string msg)
84 {
85     string open_debug_color = "\x1b[0;36m";
86     string close_color     = "\x1b[0m";
87     log(LogLevel.LOG_DEBUG, ctx, open_debug_color, msg, close_color);
88 }
89 
90 /**! Logs an event with severity HTS_LOG_TRACE and default context. Parameters: format, ... */
91 //#define hts_log_trace(...) hts_log(HTS_LOG_TRACE, __func__, __VA_ARGS__)
92 void logTrace(const(char)[] ctx, string msg)
93 {
94     string open_trace_color = "\x1b[1;36m";
95     string close_color     = "\x1b[0m";
96     log(LogLevel.LOG_TRACE, ctx, open_trace_color, msg, close_color);
97 }
98 
99 ///
100 debug(dhtslib_unittest) unittest
101 {
102     setLogLevel(LogLevel.LOG_TRACE);
103 
104     logTrace(__FUNCTION__, "Test: trace");
105     logDebug(__FUNCTION__, "Test: debug");
106     logInfo(__FUNCTION__,  "Test: info");
107     logWarning(__FUNCTION__,"Test: warning");
108     logError(__FUNCTION__, "Test: error");
109 }