1 module viva.logging.logger;
2 
3 import viva.io;
4 
5 /++
6  + Enum representing the level of logging
7  +/
8 enum LogLevel : uint
9 {
10     DEBUG = 10,
11     INFO = 20,
12     WARNING = 30,
13     ERROR = 40,
14     CRITICAL = 50
15 }
16 
17 /++
18  + The `Logger` struct manages logging with support for different levels and different outputs
19  +/
20 struct Logger
21 {
22     private {
23         string name;
24         // TODO: Replace with an output stream or something like that?
25         string output = "";
26         LogLevel level = LogLevel.WARNING;
27     }
28 
29     /++
30      + Default constructor
31      + Params:
32      +      name = The name of the application
33      +      output = Output file. Leave empty if console is used (Default = `""`)
34      +      level = The log level of the logger. The logger won't log anything lower than this level (Default = `LogLevel.WARNING`)
35      +/
36     this(string name, string output = "", LogLevel level = LogLevel.WARNING)
37     {
38         this.name = name;
39         this.output = output;
40         this.level = level;
41     }
42 
43     private void log(LogLevel msgLevel, string msg)
44     {
45         if (msgLevel >= level)
46         {
47             switch (output)
48             {
49                 case "": println(msg); break;
50                 default: println(msg); break;
51             }
52         }
53     }
54 
55     /++
56      + Returns the log level of the logger
57      +/
58     @property public LogLevel logLevel()
59     {
60         return level;
61     }
62 
63     /++
64      + Logs a debug log (`LogLevel.DEBUG`)
65      + Params:
66      +      msg = The message of the log
67      +/
68     public void _debug(string msg)
69     {
70         log(LogLevel.DEBUG, msg);
71     }
72 
73     /++
74      + Logs an info log (`LogLevel.INFO`)
75      + Params:
76      +      msg = The message of the log
77      +/
78     public void info(string msg)
79     {
80         log(LogLevel.INFO, msg);
81     }
82 
83     /++
84      + Logs a warning log (`LogLevel.WARNING`)
85      + Params:
86      +      msg = The message of the log
87      +/
88     public void warning(string msg)
89     {
90         log(LogLevel.WARNING, msg);
91     }
92 
93     /++
94      + Logs an error log (`LogLevel.ERROR`)
95      + Params:
96      +      msg = The message of the log
97      +/
98     public void error(string msg)
99     {
100         log(LogLevel.ERROR, msg);
101     }
102 
103     /++
104      + Logs a critical log (`LogLevel.CRITICAL`)
105      + Params:
106      +      msg = The message of the log
107      +/
108     public void critical(string msg)
109     {
110         log(LogLevel.CRITICAL, msg);
111     }
112 }