package file import ( "errors" "os" "github.com/fsnotify/fsnotify" "github.com/micro/go-micro/config/source" ) type watcher struct { f *file fw *fsnotify.Watcher exit chan bool } func newWatcher(f *file) (source.Watcher, error) { fw, err := fsnotify.NewWatcher() if err != nil { return nil, err } fw.Add(f.path) return &watcher{ f: f, fw: fw, exit: make(chan bool), }, nil } func (w *watcher) Next() (*source.ChangeSet, error) { // is it closed? select { case <-w.exit: return nil, errors.New("watcher stopped") default: } // try get the event select { case event, _ := <-w.fw.Events: if event.Op == fsnotify.Rename { // check existence of file, and add watch again _, err := os.Stat(event.Name) if err == nil || os.IsExist(err) { w.fw.Add(event.Name) } } c, err := w.f.Read() if err != nil { return nil, err } return c, nil case err := <-w.fw.Errors: return nil, err case <-w.exit: return nil, errors.New("watcher stopped") } } func (w *watcher) Stop() error { return w.fw.Close() }