github.com/mutagen-io/mutagen@v0.18.0-rc1/pkg/stream/multi_closer.go (about) 1 package stream 2 3 import ( 4 "io" 5 ) 6 7 // multiCloser is the io.Closer implementation underlying NewMultiCloser. 8 type multiCloser struct { 9 // closers are the underlying closers. 10 closers []io.Closer 11 } 12 13 // NewMultiCloser creates a single closer that closes multiple underlying 14 // closers. The closers are closed in the order specified, and thus higher 15 // layers should be specified before lower. All closers will be closed, but only 16 // the first error encountered will be returned. 17 func NewMultiCloser(closers ...io.Closer) io.Closer { 18 return &multiCloser{closers} 19 } 20 21 // Close implements io.Closer.Close. 22 func (c *multiCloser) Close() error { 23 var firstErr error 24 for _, closer := range c.closers { 25 if err := closer.Close(); err != nil && firstErr == nil { 26 firstErr = err 27 } 28 } 29 return firstErr 30 }