@@ -14,6 +14,8 @@ import (
14
14
"golang.org/x/xerrors"
15
15
)
16
16
17
+ var ErrWatcherClosed = xerrors .New ("watcher closed" )
18
+
17
19
// Watcher defines an interface for monitoring file system changes.
18
20
// Implementations track file modifications and provide an event stream
19
21
// that clients can consume to react to changes.
@@ -63,28 +65,36 @@ func (f *fsnotifyWatcher) Remove(file string) error {
63
65
return nil
64
66
}
65
67
66
- func (f * fsnotifyWatcher ) Next (ctx context.Context ) (* fsnotify.Event , error ) {
68
+ func (f * fsnotifyWatcher ) Next (ctx context.Context ) (event * fsnotify.Event , err error ) {
69
+ defer func () {
70
+ if ctx .Err () != nil {
71
+ event = nil
72
+ err = ctx .Err ()
73
+ }
74
+ }()
75
+
67
76
select {
68
77
case <- ctx .Done ():
69
78
return nil , ctx .Err ()
70
79
case event , ok := <- f .Events :
71
80
if ! ok {
72
- return nil , xerrors . New ( "watcher closed" )
81
+ return nil , ErrWatcherClosed
73
82
}
74
83
return & event , nil
75
84
case err , ok := <- f .Errors :
76
85
if ! ok {
77
- return nil , xerrors . New ( "watcher closed" )
86
+ return nil , ErrWatcherClosed
78
87
}
79
88
return nil , xerrors .Errorf ("watcher error: %w" , err )
80
89
case <- f .closed :
81
- return nil , xerrors . New ( "watcher closed" )
90
+ return nil , ErrWatcherClosed
82
91
}
83
92
}
84
93
85
94
func (f * fsnotifyWatcher ) Close () (err error ) {
95
+ err = ErrWatcherClosed
86
96
f .closeOnce .Do (func () {
87
- if err : = f .Watcher .Close (); err != nil {
97
+ if err = f .Watcher .Close (); err != nil {
88
98
err = xerrors .Errorf ("close watcher: %w" , err )
89
99
}
90
100
close (f .closed )
0 commit comments