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  }