github.com/Ryan-Johnson-1315/socketlogger@v0.0.2/shared.go (about) 1 package socketlogger 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "runtime" 8 "strings" 9 ) 10 11 type ( 12 MessageType string 13 messageLevel int 14 color string 15 ) 16 17 const ( 18 Log MessageType = "log" 19 Csv MessageType = "csv" 20 MessageLevelLog messageLevel = 0 21 MessageLevelWrn messageLevel = 1 22 MessageLevelSuccess messageLevel = 2 23 MessageLevelErr messageLevel = 3 24 MessageLevelDbg messageLevel = 4 25 reset color = "\033[0m" 26 red color = "\033[31m" 27 green color = "\033[32m" 28 yellow color = "\033[33m" 29 cyan color = "\033[36m" 30 udpProtocol string = "udp" 31 tcpProtocol string = "tcp" 32 bufSize int = 16384 33 ) 34 35 type SocketMessage interface { 36 String() string 37 Type() MessageType 38 } 39 40 type LogMessage struct { 41 Caller string `json:"caller"` 42 LogLevel messageLevel `json:"level"` 43 Message string `json:"message"` 44 } 45 46 type CsvMessage struct { 47 Caller string `json:"caller"` 48 Row []interface{} `json:"rows"` 49 Filename string `json:"csv_filename"` 50 } 51 52 type Connection struct { 53 Addr string 54 Port int 55 } 56 57 func (l LogMessage) String() string { 58 str := string(reset) 59 switch l.LogLevel { 60 case MessageLevelWrn: 61 str += string(yellow) 62 case MessageLevelSuccess: 63 str += string(green) 64 case MessageLevelErr: 65 str += string(red) 66 case MessageLevelDbg: 67 str += string(cyan) 68 } 69 return str + fmt.Sprintf(" | %s -- %s%s", l.Caller, l.Message, string(reset)) 70 } 71 72 func (LogMessage) Type() MessageType { 73 return Log 74 } 75 76 func newLogMessageCaller(lvl messageLevel, file string, line int, ok bool, format string, args ...interface{}) SocketMessage { 77 caller := "unknown" 78 if ok { 79 paths := strings.Split(file, "/") 80 caller = fmt.Sprintf("%s:%d", paths[len(paths)-1], line) 81 } 82 return &LogMessage{ 83 LogLevel: lvl, 84 Caller: caller, 85 Message: fmt.Sprintf(format, args...), 86 } 87 } 88 89 func newLogMessage(lvl messageLevel, format string, args ...interface{}) SocketMessage { 90 _, file, line, ok := runtime.Caller(1) 91 return newLogMessageCaller(lvl, file, line, ok, format, args...) 92 } 93 94 func (CsvMessage) Type() MessageType { 95 return Csv 96 } 97 98 func (c CsvMessage) String() string { 99 return fmt.Sprintf("Filename: %v, Row: %v", c.Filename, c.Row) 100 } 101 102 func transform(row []interface{}) []string { 103 data := make([]string, len(row)) 104 for i := 0; i < len(row); i++ { 105 if msg, ok := row[i].(*LogMessage); ok { 106 data[i] = msg.String() 107 } else { 108 data[i] = fmt.Sprint(row[i]) 109 } 110 } 111 return data 112 } 113 114 func newCsvMessage(fname string, row []interface{}) SocketMessage { 115 caller := "unknown" 116 _, file, line, ok := runtime.Caller(1) 117 if ok { 118 paths := strings.Split(file, "/") 119 caller = fmt.Sprintf("%s:%d", paths[len(paths)-1], line) 120 } 121 122 return &CsvMessage{ 123 Caller: caller, 124 Filename: fname, 125 Row: row, 126 } 127 } 128 129 func fileDirExists(dir, file string) bool { 130 return fileExists(filepath.Join(dir, file)) 131 } 132 133 func fileExists(file string) bool { 134 _, err := os.Stat(file) 135 return !os.IsNotExist(err) 136 }