From 3f2deb5a3b7dbaa978f6688059810e325977adb7 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Sat, 2 Jan 2021 18:06:47 +0100 Subject: [PATCH] cmd/age: be less clever in the lazyOpener implementation I am a fan of closures and DoerFunc interface adapters, but the boring thing is more readable. Sigh. --- cmd/age/age.go | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/cmd/age/age.go b/cmd/age/age.go index d4ec087..165f29c 100644 --- a/cmd/age/age.go +++ b/cmd/age/age.go @@ -170,8 +170,8 @@ func main() { if _, err := os.Stat(name); err == nil { logFatalf("Error: output file %q exists", name) } - f, close := lazyOpener(name) - defer close() + f := newLazyOpener(name) + defer f.Close() out = f } else if terminal.IsTerminal(int(os.Stdout.Fd())) { if armorFlag { @@ -330,31 +330,31 @@ func passphrasePrompt() (string, error) { return string(pass), nil } -type WriterFunc func(p []byte) (n int, err error) +type lazyOpener struct { + name string + f *os.File + err error +} -func (f WriterFunc) Write(p []byte) (n int, err error) { return f(p) } +func newLazyOpener(name string) io.WriteCloser { + return &lazyOpener{name: name} +} -// lazyOpener returns a Writer that opens the named file upon the first Write, -// and a function that calls Close on the file if it has been successfully -// opened, and returns nil otherwise. -func lazyOpener(name string) (w io.Writer, close func() error) { - var f *os.File - var openErr error - write := func(p []byte) (n int, err error) { - if f == nil && openErr == nil { - f, openErr = os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) - } - if openErr != nil { - return 0, openErr - } - return f.Write(p) +func (l *lazyOpener) Write(p []byte) (n int, err error) { + if l.f == nil && l.err == nil { + l.f, l.err = os.OpenFile(l.name, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) } - return WriterFunc(write), func() error { - if f != nil { - return f.Close() - } - return nil + if l.err != nil { + return 0, l.err } + return l.f.Write(p) +} + +func (l *lazyOpener) Close() error { + if l.f != nil { + return l.f.Close() + } + return nil } func logFatalf(format string, v ...interface{}) {