From c3c607e78a3170f9ce6630923e9081d7eec88359 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 6 Jul 2020 10:34:33 -0700 Subject: [PATCH] util/lineread: add little package to read lines from files/Readers --- util/lineread/lineread.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 util/lineread/lineread.go diff --git a/util/lineread/lineread.go b/util/lineread/lineread.go new file mode 100644 index 000000000..e00c3111b --- /dev/null +++ b/util/lineread/lineread.go @@ -0,0 +1,33 @@ +// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package lineread reads lines from files. It's not fancy, but it got repetitive. +package lineread + +import ( + "bufio" + "io" + "os" +) + +// File opens name and calls fn for each line. It returns an error if the Open failed +// or once fn returns an error. +func File(name string, fn func(line []byte) error) error { + f, err := os.Open(name) + if err != nil { + return err + } + defer f.Close() + return Reader(f, fn) +} + +func Reader(r io.Reader, fn func(line []byte) error) error { + bs := bufio.NewScanner(r) + for bs.Scan() { + if err := fn(bs.Bytes()); err != nil { + return err + } + } + return bs.Err() +}