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  }