From 75b8024d68ccb7db451c271d99f56ab3a24a8795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Mengu=C3=A9?= Date: Mon, 18 May 2026 17:55:53 +0200 Subject: [PATCH] main: refactor I/O Refactor I/O handling to handle closing from getIO() func. --- main.go | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/main.go b/main.go index 0cd0ef2..26364e6 100644 --- a/main.go +++ b/main.go @@ -64,55 +64,50 @@ func main() { } // getIO returns input and output streams based on command-line flags. -func getIO() (in io.ReadCloser, out io.WriteCloser, err error) { +func getIO() (in io.Reader, out io.Writer, closeAll func(), err error) { + var files []*os.File + closeAll = func() { + for _, f := range files { + if err := f.Close(); err != nil { + panic(err) + } + } + } + in, out = os.Stdin, os.Stdout if flag.NArg() > 0 && flag.Arg(0) != "-" { - in, err = os.Open(flag.Arg(0)) + f, err := os.Open(flag.Arg(0)) if err != nil { - return nil, nil, err + return nil, nil, nil, err } + files = append(files, f) + in = f if *outputFile == "" { *outputFile = flag.Arg(0) + ".go" } } if *outputFile != "" && *outputFile != "-" { - out, err = os.OpenFile(*outputFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) + f, err := os.OpenFile(*outputFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { - if in != nil && in != os.Stdin { - err := in.Close() - if err != nil { - panic(err) - } - } - return nil, nil, err + closeAll() + return nil, nil, nil, err } + files = append(files, f) + out = f } - return in, out, nil + return in, out, closeAll, nil } // parse reads input, parses, executes, and compiles the PEG grammar. func parse(compile func(*Peg[uint32], io.Writer) error) error { - in, out, err := getIO() + in, out, closeAll, err := getIO() if err != nil { return err } - defer func() { - if in != nil && in != os.Stdin { - err := in.Close() - if err != nil { - panic(err) - } - } - if out != nil && out != os.Stdout { - err := out.Close() - if err != nil { - panic(err) - } - } - }() + defer closeAll() buffer, err := io.ReadAll(in) if err != nil {