Added Hot Reload For Configs:

- Added hot reload for config changes
- Slight change to config path for OS agnostic file path
This commit is contained in:
2024-11-14 16:02:19 -08:00
parent fdb58dfa97
commit 527d96b286
2 changed files with 31 additions and 4 deletions

2
go.mod
View File

@@ -3,13 +3,13 @@ module github.com/sapphiregaze/discord-gorp
go 1.22.7
require (
github.com/fsnotify/fsnotify v1.7.0
github.com/gorilla/websocket v1.5.3
github.com/lmittmann/tint v1.0.5
github.com/spf13/viper v1.19.0
)
require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect

View File

@@ -4,7 +4,9 @@ import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"github.com/sapphiregaze/discord-gorp/pkg/logger"
@@ -76,7 +78,7 @@ func Load() (*Config, error) {
return nil, err
}
configDir := filepath.Join(homeDir, ".config/discord-gorp")
configDir := filepath.Join(homeDir, ".config", "discord-gorp")
configPath := filepath.Join(configDir, "config.yaml")
if _, err := os.Stat(configPath); os.IsNotExist(err) {
@@ -96,14 +98,39 @@ func Load() (*Config, error) {
}
viper.SetConfigFile(configPath)
viper.SetConfigType("yaml")
if err := viper.ReadInConfig(); err != nil {
return nil, err
return nil, fmt.Errorf("error reading config file: %w", err)
}
logger.Info(fmt.Sprintf("Initial config loaded from %s", configPath))
var config Config
if err := viper.Unmarshal(&config); err != nil {
return nil, err
return nil, fmt.Errorf("error unmarshalling config: %w", err)
}
var lastChange time.Time
viper.WatchConfig()
logger.Info(fmt.Sprintf("Watching for config changes at %s", configPath))
viper.OnConfigChange(func(e fsnotify.Event) {
// debounce mechanism to ensure only one reload happens per file change/save
if time.Since(lastChange) < time.Millisecond*100 {
return
}
lastChange = time.Now()
logger.Info(fmt.Sprintf("Config file changed at %s", e.Name))
if err := viper.Unmarshal(&config); err != nil {
logger.Error(fmt.Sprintf("Failed to reload config: %v", err))
return
}
logger.Info("Config reloaded successfully")
})
return &config, nil
}