lineread.go 963 B

12345678910111213141516171819202122232425262728293031323334353637
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. // Package lineread reads lines from files. It's not fancy, but it got repetitive.
  4. package lineread
  5. import (
  6. "bufio"
  7. "io"
  8. "os"
  9. )
  10. // File opens name and calls fn for each line. It returns an error if the Open failed
  11. // or once fn returns an error.
  12. func File(name string, fn func(line []byte) error) error {
  13. f, err := os.Open(name)
  14. if err != nil {
  15. return err
  16. }
  17. defer f.Close()
  18. return Reader(f, fn)
  19. }
  20. // Reader calls fn for each line.
  21. // If fn returns an error, Reader stops reading and returns that error.
  22. // Reader may also return errors encountered reading and parsing from r.
  23. // To stop reading early, use a sentinel "stop" error value and ignore
  24. // it when returned from Reader.
  25. func Reader(r io.Reader, fn func(line []byte) error) error {
  26. bs := bufio.NewScanner(r)
  27. for bs.Scan() {
  28. if err := fn(bs.Bytes()); err != nil {
  29. return err
  30. }
  31. }
  32. return bs.Err()
  33. }