From e18d36ebae30536c77c61cd5da123991e0ca1629 Mon Sep 17 00:00:00 2001
From: Rasmus Dahlberg <rasmus@rgdd.se>
Date: Sun, 31 Dec 2023 09:39:25 +0100
Subject: Add drafty prototype

---
 internal/logger/logger.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)
 create mode 100644 internal/logger/logger.go

(limited to 'internal/logger')

diff --git a/internal/logger/logger.go b/internal/logger/logger.go
new file mode 100644
index 0000000..195ad3e
--- /dev/null
+++ b/internal/logger/logger.go
@@ -0,0 +1,96 @@
+package logger
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"sync"
+)
+
+const (
+	LevelDebug Level = iota + 1
+	LevelInfo
+	LevelNotice
+	LevelFatal
+)
+
+type Level int
+
+func NewLevel(str string) (Level, error) {
+	switch str {
+	case LevelDebug.String():
+		return LevelDebug, nil
+	case LevelInfo.String():
+		return LevelInfo, nil
+	case LevelNotice.String():
+		return LevelNotice, nil
+	case LevelFatal.String():
+		return LevelFatal, nil
+	}
+	return Level(0), fmt.Errorf("unknown level %q", str)
+}
+
+func (lv Level) String() string {
+	switch lv {
+	case LevelDebug:
+		return "DEBUG"
+	case LevelInfo:
+		return "INFO"
+	case LevelNotice:
+		return "NOTICE"
+	case LevelFatal:
+		return "FATAL"
+	default:
+		return "UNKNOWN"
+	}
+}
+
+type Config struct {
+	Level Level
+	File  *os.File
+}
+
+type Logger struct {
+	cfg   Config
+	log   log.Logger
+	mutex sync.Mutex
+}
+
+func New(cfg Config) (l Logger) {
+	l.Reconfigure(cfg)
+	return
+}
+
+func (l *Logger) Reconfigure(cfg Config) {
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
+
+	if cfg.Level < LevelDebug || cfg.Level > LevelFatal {
+		cfg.Level = LevelNotice
+	}
+	if cfg.File == nil {
+		cfg.File = os.Stdout
+	}
+
+	l.cfg = cfg
+	l.log = *log.New(l.cfg.File, "", log.Ldate|log.Ltime)
+}
+
+func (l *Logger) IsConfigured() bool {
+	return l.cfg.File != nil
+}
+
+func (l *Logger) Debugf(format string, args ...interface{})  { l.printf(LevelDebug, format, args...) }
+func (l *Logger) Infof(format string, args ...interface{})   { l.printf(LevelInfo, format, args...) }
+func (l *Logger) Noticef(format string, args ...interface{}) { l.printf(LevelNotice, format, args...) }
+func (l *Logger) Fatalf(format string, args ...interface{})  { l.printf(LevelFatal, format, args...) }
+func (l *Logger) Dief(format string, args ...interface{})    { l.Fatalf(format, args...); os.Exit(1) }
+
+func (l *Logger) printf(lv Level, format string, args ...interface{}) {
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
+
+	if l.cfg.Level <= lv {
+		l.log.Printf("["+lv.String()+"] "+format, args...)
+	}
+}
-- 
cgit v1.2.3