//Src returns a channel of gonzo.Files that match the provided patterns. //TODO: ADD support for prefix to avoid all the util.Trims func Src(ctx context.Context, globs ...string) gonzo.Pipe { ctx, cancel := context.WithCancel(ctx) files := make(chan gonzo.File) pipe := gonzo.NewPipe(ctx, files) //TODO: Parse globs here, check for invalid globs, split them into "filters". go func() { var err error defer close(files) fileslist, err := glob.Glob(globs...) if err != nil { ctx.Error(err) return } for mp := range fileslist { var ( file gonzo.File base = glob.Dir(mp.Glob) name = mp.Name ) file, err = Read(mp.Name) ctx = context.WithValue(ctx, "file", name) if err == ErrIsDir { ctx.Warn("fs.Src Ignored Directory.") continue } if err != nil { cancel() ctx.Error(err) return } file.FileInfo().SetBase(base) file.FileInfo().SetName(name) files <- file } }() return pipe }
func Watcher(ctx context.Context, cb func(string), globs ...string) error { files, err := glob.Glob(globs...) if err != nil { return err } w, err := fsnotify.NewWatcher() if err != nil { return err } for matchpair := range files { w.Add(matchpair.Name) } throttled := throttle(50 * time.Millisecond) go func() { for { select { case event := <-w.Events: //if event.Op&fsnotify.Write == fsnotify.Write { //event.Op&fsnotify.Create == fsnotify.Create || throttled(func() { cb(event.Name) }) //} case err := <-w.Errors: if err != nil { ctx.Error(err) } case <-ctx.Done(): w.Close() return } } }() return nil }