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 }