Files
pointerreplacer/cmd/root.go
Mikess, Sebastian 1a6de9b64f interval
2024-07-17 17:54:18 +02:00

74 lines
1.5 KiB
Go

package main
import (
"log/slog"
"math/rand/v2"
"os"
"time"
"github.com/fsnotify/fsnotify"
"gopkg.in/yaml.v3"
)
type InputDb map[int]string
func newInputDbFromFile(path string, db *InputDb) {
file, err := os.ReadFile(path)
if err != nil {
slog.Error("Could not open file", "path", path)
os.Exit(1)
}
err = yaml.Unmarshal(file, &db)
if err != nil {
slog.Error("Error unmarshaling", "path", path, "error", err)
} else {
slog.Info("Reloaded Input", "path", path)
}
}
func (db InputDb) Lookup(key int) string {
value, ok := db[key]
if !ok {
return "X"
}
return value
}
func main() {
var db InputDb
done := make(chan struct{}, 1)
ticker := time.NewTicker(3 * time.Millisecond)
watcher, err := fsnotify.NewWatcher()
if err != nil {
slog.Error("Could not create Watcher", "error", err)
}
defer watcher.Close()
newInputDbFromFile("input/input.yml", &db)
slog.Info("Loaded DB", "db", db)
err = watcher.Add("input/input.yml")
if err != nil {
slog.Error("Could not watch path", "path", "input/input.yml")
}
go func() {
for {
select {
case t := <-ticker.C:
key := rand.IntN(9) + 1
value := db.Lookup(key)
slog.Info("Got Rand", "key", key, "value", value, "ticker", t)
case event, ok := <-watcher.Events:
if !ok {
slog.Error("Could not log Event", "event.name", event.Name, "event.op", event.Op)
}
slog.Info("Got Event", "event.name", event.Name, "event.op", event.Op)
newInputDbFromFile("input/input.yml", &db)
}
}
}()
<-done
}