1 /** 2 * The custom text transformer that implements the gogga-stylised 3 * logging messages 4 */ 5 module gogga.transform; 6 7 import dlog; 8 import gogga.context; 9 import std.conv : to; 10 11 /** 12 * The gogga styles supported 13 */ 14 public enum GoggaMode 15 { 16 TwoKTwenty3, 17 SIMPLE, 18 RUSTACEAN 19 } 20 21 /** 22 * The custom gogga text transformer 23 */ 24 public class GoggaTransform : MessageTransform 25 { 26 /** 27 * Current style 28 */ 29 private GoggaMode mode; 30 31 /** 32 * Transforms the provided text 33 * 34 * Params: 35 * text = text to transform 36 * ctx = the context passed in 37 * Returns: a string of transformed text 38 */ 39 public override string transform(string text, Context ctx) 40 { 41 /* The generated output string */ 42 string finalOutput; 43 44 45 /* Get the GoggaContext */ 46 GoggaContext gCtx = cast(GoggaContext)ctx; 47 48 /* Extract the line information */ 49 CompilationInfo compInfo = gCtx.getLineInfo(); 50 string[] context = compInfo.toArray(); 51 52 /* Extract the Level */ 53 Level level = gCtx.getLevel(); 54 55 56 /** 57 * Simple mode is just: `[<LEVEL>] <message>` 58 */ 59 if(mode == GoggaMode.SIMPLE) 60 { 61 finalOutput = cast(string)debugColor("["~to!(string)(level)~"] ", level); 62 63 finalOutput ~= text~"\n"; 64 } 65 /** 66 * TwoKTwenty3 is: `[<file>] (<module>:<lineNumber>) <message>` 67 */ 68 else if(mode == GoggaMode.TwoKTwenty3) 69 { 70 /* Module information (and status debugColoring) */ 71 string moduleInfo = cast(string)debugColor("["~context[1]~"]", level); 72 73 /* Function and line number info */ 74 string funcInfo = cast(string)(colorSrc("("~context[4]~":"~context[2]~")")); 75 76 finalOutput = moduleInfo~" "~funcInfo~" "~text~"\n"; 77 } 78 /** 79 * Rustacean mode is: `[<LEVEL>] (<filePath>/<functionName>:<lineNumber>) <message>` 80 */ 81 else 82 { 83 finalOutput = cast(string)debugColor(to!(string)(level)~"\t", level); 84 finalOutput ~= cast(string)(colorSrc(context[1]~"/"~context[4]~":"~context[2]~" ")); 85 finalOutput ~= text~"\n"; 86 } 87 88 return finalOutput; 89 } 90 91 /** 92 * Set the gogga style 93 * 94 * Params: 95 * mode = the GoggaMode to use 96 */ 97 public void setMode(GoggaMode mode) 98 { 99 this.mode = mode; 100 } 101 } 102 103 /** 104 * Colorise the text provided accoridng to the level and then 105 * reset the colors at the end 106 * 107 * Params: 108 * text = the text to colorise 109 * level = the color to use 110 * Returns: the byte sequence of characters and controls 111 */ 112 private byte[] debugColor(string text, Level level) 113 { 114 /* The generated message */ 115 byte[] messageBytes; 116 117 /* If INFO, set green */ 118 if(level == Level.INFO) 119 { 120 messageBytes = cast(byte[])[27, '[','3','2','m']; 121 } 122 /* If WARNING, set warning */ 123 else if(level == Level.WARN) 124 { 125 messageBytes = cast(byte[])[27, '[','3','5','m']; /* TODO: FInd yllow */ 126 } 127 /* If ERROR, set error */ 128 else if(level == Level.ERROR) 129 { 130 messageBytes = cast(byte[])[27, '[','3','1','m']; 131 } 132 133 /* Add the message */ 134 messageBytes ~= cast(byte[])text; 135 136 /* Switch back debugColor */ 137 messageBytes ~= cast(byte[])[27, '[', '3', '9', 'm']; 138 139 /* Reset coloring */ 140 messageBytes ~= [27, '[', 'm']; 141 142 return messageBytes; 143 } 144 145 /** 146 * Colors the provided text in a gray fashion and then 147 * resets back to normal 148 * 149 * Params: 150 * text = the text to gray color 151 * Returns: the byte sequence of characters and controls 152 */ 153 private byte[] colorSrc(string text) 154 { 155 /* The generated message */ 156 byte[] messageBytes; 157 158 /* Reset coloring */ 159 messageBytes ~= [27, '[', 'm']; 160 161 /* Color gray */ 162 messageBytes ~= [27, '[', '3', '9', ';', '2', 'm']; 163 164 /* Append the message */ 165 messageBytes ~= text; 166 167 /* Reset coloring */ 168 messageBytes ~= [27, '[', 'm']; 169 170 return messageBytes; 171 }