package watchers import ( "fmt" "strings" "sync" "Moonshark/router" "Moonshark/runner" "Moonshark/utils/color" "Moonshark/utils/logger" ) // 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.LuaRouter, 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.Info("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.Info("Started watching Lua modules! %s", color.Yellow(dir)) } return watchers, nil }