46 lines
849 B
Go
46 lines
849 B
Go
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()
|
|
}
|