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  }