package notes import ( "bufio" "bytes" "local/notes-server/filetree" "os" "path/filepath" ) func (n *Notes) Search(phrase string) (string, error) { files := filetree.NewFiles() err := filepath.Walk(n.root, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { return nil } ok, err := grepFile(path, []byte(phrase)) if ok { p := filetree.NewPathFromLocal(path) files.Push(p, info) } return err }, ) return filetree.Paths(*files).List(), err } func grepFile(file string, pat []byte) (bool, error) { f, err := os.Open(file) if err != nil { return false, err } defer f.Close() scanner := bufio.NewScanner(f) for scanner.Scan() { if bytes.Contains(scanner.Bytes(), pat) { return true, scanner.Err() } } return false, scanner.Err() }