github.com/wader/devd@v0.0.0-20221031103345-441c7e455249/watch.go (about)

     1  package devd
     2  
     3  import (
     4  	"os"
     5  	"time"
     6  
     7  	"github.com/cortesi/moddwatch"
     8  	"github.com/cortesi/termlog"
     9  	"github.com/wader/devd/livereload"
    10  )
    11  
    12  const batchTime = time.Millisecond * 200
    13  
    14  // Watch watches an endpoint for changes, if it supports them.
    15  func (r Route) Watch(
    16  	ch chan []string,
    17  	excludePatterns []string,
    18  	log termlog.Logger,
    19  ) (*moddwatch.Watcher, error) {
    20  	wd, err := os.Getwd()
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	var watcher *moddwatch.Watcher
    25  	switch r.Endpoint.(type) {
    26  	case *filesystemEndpoint:
    27  		ep := *r.Endpoint.(*filesystemEndpoint)
    28  		modchan := make(chan *moddwatch.Mod, 1)
    29  		watcher, err = moddwatch.Watch(
    30  			wd,
    31  			[]string{ep.Root + "/...", "**"},
    32  			excludePatterns,
    33  			batchTime,
    34  			modchan,
    35  		)
    36  		if err != nil {
    37  			return nil, err
    38  		}
    39  		go func() {
    40  			for mod := range modchan {
    41  				if !mod.Empty() {
    42  					ch <- mod.All()
    43  				}
    44  			}
    45  		}()
    46  	}
    47  	return watcher, nil
    48  }
    49  
    50  // WatchPaths watches a set of paths, and broadcasts changes through reloader.
    51  func WatchPaths(paths, excludePatterns []string, reloader livereload.Reloader, log termlog.Logger) error {
    52  	wd, err := os.Getwd()
    53  	if err != nil {
    54  		return err
    55  	}
    56  	ch := make(chan []string, 1)
    57  	for _, path := range paths {
    58  		modchan := make(chan *moddwatch.Mod, 1)
    59  		_, err := moddwatch.Watch(
    60  			wd,
    61  			[]string{path},
    62  			excludePatterns,
    63  			batchTime,
    64  			modchan,
    65  		)
    66  		if err != nil {
    67  			return err
    68  		}
    69  		go func() {
    70  			for mod := range modchan {
    71  				if !mod.Empty() {
    72  					ch <- mod.All()
    73  				}
    74  			}
    75  		}()
    76  	}
    77  	go reloader.Watch(ch)
    78  	return nil
    79  }
    80  
    81  // WatchRoutes watches the route collection, and broadcasts changes through reloader.
    82  func WatchRoutes(routes RouteCollection, reloader livereload.Reloader, excludePatterns []string, log termlog.Logger) error {
    83  	c := make(chan []string, 1)
    84  	for i := range routes {
    85  		_, err := routes[i].Watch(c, excludePatterns, log)
    86  		if err != nil {
    87  			return err
    88  		}
    89  	}
    90  	go reloader.Watch(c)
    91  	return nil
    92  }