// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. package notify import "errors" var ( errAlreadyWatched = errors.New("path is already watched") errNotWatched = errors.New("path is not being watched") errInvalidEventSet = errors.New("invalid event set provided") ) // Watcher is a intermediate interface for wrapping inotify, ReadDirChangesW, // FSEvents, kqueue and poller implementations. // // The watcher implementation is expected to do its own mapping between paths and // create watchers if underlying event notification does not support it. For // the ease of implementation it is guaranteed that paths provided via Watch and // Unwatch methods are absolute and clean. type watcher interface { // Watch requests a watcher creation for the given path and given event set. Watch(path string, event Event) error // Unwatch requests a watcher deletion for the given path and given event set. Unwatch(path string) error // Rewatch provides a functionality for modifying existing watch-points, like // expanding its event set. // // Rewatch modifies existing watch-point under for the given path. It passes // the existing event set currently registered for the given path, and the // new, requested event set. // // It is guaranteed that Tree will not pass to Rewatch zero value for any // of its arguments. If old == new and watcher can be upgraded to // recursiveWatcher interface, a watch for the corresponding path is expected // to be changed from recursive to the non-recursive one. Rewatch(path string, old, new Event) error // Close unwatches all paths that are registered. When Close returns, it // is expected it will report no more events. Close() error } // RecursiveWatcher is an interface for a Watcher for those OS, which do support // recursive watching over directories. type recursiveWatcher interface { RecursiveWatch(path string, event Event) error // RecursiveUnwatch removes a recursive watch-point given by the path. For // native recursive implementation there is no difference in functionality // between Unwatch and RecursiveUnwatch, however for those platforms, that // requires emulation for recursive watch-points, the implementation differs. RecursiveUnwatch(path string) error // RecursiveRewatcher provides a functionality for modifying and/or relocating // existing recursive watch-points. // // To relocate a watch-point means to unwatch oldpath and set a watch-point on // newpath. // // To modify a watch-point means either to expand or shrink its event set. // // Tree can want to either relocate, modify or relocate and modify a watch-point // via single RecursiveRewatch call. // // If oldpath == newpath, the watch-point is expected to change its event set value // from oldevent to newevent. // // If oldevent == newevent, the watch-point is expected to relocate from oldpath // to the newpath. // // If oldpath != newpath and oldevent != newevent, the watch-point is expected // to relocate from oldpath to the newpath first and then change its event set // value from oldevent to the newevent. In other words the end result must be // a watch-point set on newpath with newevent value of its event set. // // It is guaranteed that Tree will not pass to RecurisveRewatcha zero value // for any of its arguments. If oldpath == newpath and oldevent == newevent, // a watch for the corresponding path is expected to be changed for // non-recursive to the recursive one. RecursiveRewatch(oldpath, newpath string, oldevent, newevent Event) error }