85 lines
2.0 KiB
Go

package watchers
import (
"fmt"
"strings"
"sync"
"Moonshark/color"
"Moonshark/logger"
"Moonshark/router"
"Moonshark/runner"
)
// Global watcher manager instance with explicit creation
var (
globalManager *WatcherManager
globalManagerOnce sync.Once
)
// GetWatcherManager returns the global watcher manager, creating it if needed
func GetWatcherManager() *WatcherManager {
globalManagerOnce.Do(func() {
globalManager = NewWatcherManager(DefaultPollInterval)
})
return globalManager
}
// ShutdownWatcherManager closes the global watcher manager if it exists
func ShutdownWatcherManager() {
if globalManager != nil {
globalManager.Close()
globalManager = nil
}
}
// WatchLuaRouter sets up a watcher for a LuaRouter's routes directory
func WatchLuaRouter(router *router.Router, runner *runner.Runner, routesDir string) (*DirectoryWatcher, error) {
manager := GetWatcherManager()
config := DirectoryWatcherConfig{
Dir: routesDir,
Callback: router.Refresh,
Recursive: true,
}
watcher, err := manager.WatchDirectory(config)
if err != nil {
return nil, fmt.Errorf("failed to watch directory: %w", err)
}
logger.Infof("Started watching Lua routes! %s", color.Yellow(routesDir))
return watcher, nil
}
// WatchLuaModules sets up watchers for Lua module directories
func WatchLuaModules(luaRunner *runner.Runner, libDirs []string) ([]*DirectoryWatcher, error) {
manager := GetWatcherManager()
watchers := make([]*DirectoryWatcher, 0, len(libDirs))
for _, dir := range libDirs {
config := DirectoryWatcherConfig{
Dir: dir,
EnhancedCallback: func(changes []FileChange) error {
for _, change := range changes {
if !change.IsDeleted && strings.HasSuffix(change.Path, ".lua") {
luaRunner.NotifyFileChanged(change.Path)
}
}
return nil
},
Recursive: true,
}
watcher, err := manager.WatchDirectory(config)
if err != nil {
// Error handling...
}
watchers = append(watchers, watcher)
logger.Infof("Started watching Lua modules! %s", color.Yellow(dir))
}
return watchers, nil
}