github.com/jmigpin/editor@v1.6.0/core/fswatcher/fsnwatcher.go (about) 1 package fswatcher 2 3 import ( 4 fsnotify "github.com/fsnotify/fsnotify" 5 ) 6 7 type FsnWatcher struct { 8 w *fsnotify.Watcher 9 events chan interface{} 10 opMask Op 11 } 12 13 func NewFsnWatcher() (*FsnWatcher, error) { 14 w0, err := fsnotify.NewWatcher() 15 if err != nil { 16 return nil, err 17 } 18 w := &FsnWatcher{ 19 w: w0, 20 events: make(chan interface{}), 21 } 22 23 w.opMask = AllOps 24 25 go w.eventLoop() 26 return w, nil 27 } 28 29 //---------- 30 31 func (w *FsnWatcher) Close() error { 32 return w.w.Close() 33 } 34 35 func (w *FsnWatcher) OpMask() *Op { 36 return &w.opMask 37 } 38 39 //---------- 40 41 func (w *FsnWatcher) Add(name string) error { 42 return w.w.Add(name) 43 } 44 func (w *FsnWatcher) Remove(name string) error { 45 return w.w.Remove(name) 46 } 47 48 //---------- 49 50 func (w *FsnWatcher) Events() <-chan interface{} { 51 return w.events 52 } 53 54 //---------- 55 56 func (w *FsnWatcher) eventLoop() { 57 for { 58 select { 59 case err, ok := <-w.w.Errors: 60 if !ok { 61 return 62 } 63 w.events <- err 64 65 case ev, ok := <-w.w.Events: 66 if !ok { 67 return 68 } 69 name := ev.Name 70 var op Op 71 if ev.Op&fsnotify.Create > 0 { 72 op.Add(Create) 73 } 74 if ev.Op&fsnotify.Write > 0 { 75 op.Add(Modify) 76 } 77 if ev.Op&fsnotify.Remove > 0 { 78 op.Add(Remove) 79 } 80 if ev.Op&fsnotify.Rename > 0 { 81 op.Add(Rename) 82 } 83 if ev.Op&fsnotify.Chmod > 0 { 84 op.Add(Attrib) 85 } 86 87 op2 := op & w.opMask 88 if op2 > 0 { 89 w.events <- &Event{Op: op, Name: name} 90 } else { 91 //log.Printf("not sending event: %v", ev) 92 } 93 } 94 } 95 }