1 /**
2 * Copyright © DiamondMVC 2018
3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 */
6 module diamond.core.debugging;
7 
8 version (Diamond_Debug)
9 {
10   /// Boolean determining whether application is being debugged or not.
11   static const bool debugging = true;
12 }
13 else
14 {
15   /// Boolean determining whether application is being debugged or not.
16   static const bool debugging = false;
17 }
18 
19 static if (debugging)
20 {
21   public import diamond.core.io;
22 
23   /// A stack logger wrapper.
24   class StackLogger
25   {
26     private:
27     /// The call stack of the logger.
28     string[] _callStack;
29 
30     /// Creates a new stack logger.
31     this() {}
32 
33     public:
34     /// Gets the current callstack.
35     @property const(string[]) callStack() { return _callStack; }
36 
37     /// Logs the current call.
38     void log(in string file = __FILE__, in size_t line = __LINE__, in string mod = __MODULE__, in string func = __PRETTY_FUNCTION__)
39     {
40       import std..string : format;
41 
42       _callStack ~= format("file: '%s' line: '%s' module: '%s' function: '%s'", file, line, mod, func);
43     }
44 
45     /// Clears the call stack.
46     void clear()
47     {
48       _callStack = null;
49     }
50 
51     /// Prints the call stack.
52     void printCallStack()
53     {
54       print(_callStack);
55     }
56   }
57 
58   /// The thread-local stack logger.
59   private StackLogger _stackLogger;
60 
61   /// Gets the stack logger for the current thread.
62   @property StackLogger stackLogger()
63   {
64     if (_stackLogger)
65     {
66       return _stackLogger;
67     }
68 
69     _stackLogger = new StackLogger;
70 
71     return _stackLogger;
72   }
73 }