1 module dls.util.logger;
2 
3 import dls.protocol.interfaces : InitializeParams, MessageType;
4 import std.conv : to;
5 
6 shared auto logger = new shared LspLogger();
7 private immutable int[InitializeParams.Trace] traceToType;
8 
9 shared static this()
10 {
11     import std.experimental.logger : LogLevel, globalLogLevel;
12 
13     globalLogLevel = LogLevel.off;
14 
15     //dfmt off
16     traceToType = [
17         InitializeParams.Trace.off: 0,
18         InitializeParams.Trace.messages: MessageType.warning.to!int,
19         InitializeParams.Trace.verbose: MessageType.log.to!int
20     ];
21     //dfmt on
22 }
23 
24 private shared class LspLogger
25 {
26     import std.format : format;
27 
28     private int _messageType;
29 
30     @property void trace(in InitializeParams.Trace t)
31     {
32         _messageType = traceToType[t];
33     }
34 
35     void info(in string message) const
36     {
37         sendMessage(message, MessageType.info);
38     }
39 
40     void infof(Args...)(in string message, Args args) const
41     {
42         info(format(message, args));
43     }
44 
45     void warning(in string message) const
46     {
47         sendMessage(message, MessageType.warning);
48     }
49 
50     void warningf(Args...)(in string message, Args args) const
51     {
52         warning(format(message, args));
53     }
54 
55     void error(in string message) const
56     {
57         sendMessage(message, MessageType.error);
58     }
59 
60     void errorf(Args...)(in string message, Args args) const
61     {
62         error(format(message, args));
63     }
64 
65     private void sendMessage(in string message, in MessageType type) const
66     {
67         import dls.protocol.interfaces : LogMessageParams;
68         import dls.protocol.jsonrpc : send;
69         import std.datetime : Clock;
70 
71         if (type <= _messageType)
72         {
73             send("window/logMessage", new LogMessageParams(type,
74                     format!"%s\t%s"(Clock.currTime.toString(), message)));
75         }
76     }
77 }