github.com/grailbio/base@v0.0.11/fileio/close.go (about) 1 package fileio 2 3 import ( 4 "fmt" 5 "io" 6 7 "github.com/grailbio/base/errors" 8 ) 9 10 type named interface { 11 // Name returns the path name. 12 Name() string 13 } 14 15 // CloseAndReport returns a defer-able helper that calls f.Close and reports errors, if any, 16 // to *err. Pass your function's named return error. Example usage: 17 // 18 // func processFile(filename string) (_ int, err error) { 19 // f, err := os.Open(filename) 20 // if err != nil { ... } 21 // defer fileio.CloseAndReport(f, &err) 22 // ... 23 // } 24 // 25 // If your function returns with an error, any f.Close error will be chained appropriately. 26 // 27 // Deprecated: Use errors.CleanUp directly. 28 func CloseAndReport(f io.Closer, err *error) { 29 errors.CleanUp(f.Close, err) 30 } 31 32 // MustClose is a defer-able function that calls f.Close and panics on error. 33 // 34 // Example: 35 // f, err := os.Open(filename) 36 // if err != nil { panic(err) } 37 // defer fileio.MustClose(f) 38 // ... 39 func MustClose(f io.Closer) { 40 if err := f.Close(); err != nil { 41 if n, ok := f.(named); ok { 42 panic(fmt.Sprintf("close %s: %v", n.Name(), err)) 43 } 44 panic(err) 45 } 46 }