From c294d098e2dcce0fc7a603662f6d8fd2d5bd31f6 Mon Sep 17 00:00:00 2001 From: Marin Ivanov Date: Sat, 6 Apr 2024 23:26:02 +0300 Subject: add logging --- logger.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 22 +++++++++------ 2 files changed, 106 insertions(+), 8 deletions(-) create mode 100644 logger.go diff --git a/logger.go b/logger.go new file mode 100644 index 0000000..1fcbfeb --- /dev/null +++ b/logger.go @@ -0,0 +1,92 @@ +package main + +import ( + "fmt" + "log" +) + +type LevelEnum uint8 + +const ( + None LevelEnum = iota + Error + Warn + Info + Debug +) + +type levelInfo struct { + abbrev string + color string +} + +var ( + levelInfos = map[LevelEnum]levelInfo{ + Error: {"ERR", ansiRed}, + Warn: {"WARN", ansiYellow}, + Info: {"INFO", ansiCyan}, + Debug: {"DEBUG", ansiGreen}, + } +) + +func (s LevelEnum) Info() levelInfo { + info, ok := levelInfos[s] + if !ok { + return levelInfo{"UNK", ansiWhite} + } + return info +} + +func (s LevelEnum) Format() string { + info := s.Info() + return colorize("["+info.abbrev+"]", info.color) +} + +type Logger struct { + Level LevelEnum + + ns string +} + +func NewLogger(level LevelEnum) *Logger { + return &Logger{ + Level: level, + } +} + +func (l *Logger) WithNS(ns string) *Logger { + return &Logger{ + Level: l.Level, + ns: formatNS(ns), + } +} + +func (l *Logger) Logf(level LevelEnum, format string, args ...any) { + if level > l.Level { + return + } + log.Printf("%s%s %s", l.ns, level.Format(), fmt.Sprintf(format, args...)) +} + +func (l *Logger) Errorf(format string, args ...any) { l.Logf(Error, format, args...) } +func (l *Logger) Warnf(format string, args ...any) { l.Logf(Warn, format, args...) } +func (l *Logger) Infof(format string, args ...any) { l.Logf(Info, format, args...) } +func (l *Logger) Debugf(format string, args ...any) { l.Logf(Debug, format, args...) } + +func formatNS(ns string) string { + return colorize("["+ns+"]", ansiPurple) +} + +var ansiReset = "\033[0m" +var ansiRed = "\033[31m" +var ansiGreen = "\033[32m" +var ansiYellow = "\033[33m" +var ansiBlue = "\033[34m" +var ansiPurple = "\033[35m" +var ansiCyan = "\033[36m" +var ansiGray = "\033[37m" +var ansiWhite = "\033[97m" + +func colorize(s string, color string) string { + return color + s + ansiReset +} diff --git a/main.go b/main.go index a72bb5b..7340795 100644 --- a/main.go +++ b/main.go @@ -18,20 +18,29 @@ func main() { flag.BoolVarP(&concatenate, "concatenate", "c", false, "concatenate tar archives") flag.Parse() - if err := process(prefix, concatenate, verbose); err != nil { + logger := NewLogger(LevelEnum(verbose) + 2) + params := processParams{ + prefix: prefix, + concatenate: concatenate, + } + if err := process(params, logger); err != nil { log.Fatal(err) } +} +type processParams struct { + prefix string + concatenate bool } -func process(prefix string, concatenate bool, verbose int) error { +func process(params processParams, logger *Logger) error { tr := tar.NewReader(os.Stdin) tw := tar.NewWriter(os.Stdout) defer tw.Close() for { hdr, err := tr.Next() if err == io.EOF { - if !concatenate { + if params.concatenate { tr = tar.NewReader(os.Stdin) hdr, err = tr.Next() if err == io.EOF { @@ -46,11 +55,8 @@ func process(prefix string, concatenate bool, verbose int) error { return err } - if verbose >= 1 { - log.Printf("file: %s", hdr.Name) - } - - hdr.Name = prefix + hdr.Name + logger.Infof(`TarEntry.name = %s`, hdr.Name) + hdr.Name = params.prefix + hdr.Name if err = tw.WriteHeader(hdr); err != nil { return err -- cgit v1.2.3