github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/combined.go (about)

     1  package xio
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  )
     7  
     8  // CombinedReadWriteCloser is middle struct to combine Reader/Writer/Closer
     9  type CombinedReadWriteCloser struct {
    10  	io.Reader
    11  	io.Writer
    12  	io.Closer
    13  }
    14  
    15  // NewCombinedReadWriteCloser will return new combined
    16  func NewCombinedReadWriteCloser(reader io.Reader, writer io.Writer, closer io.Closer) (combined *CombinedReadWriteCloser) {
    17  	combined = &CombinedReadWriteCloser{
    18  		Reader: reader,
    19  		Writer: writer,
    20  		Closer: closer,
    21  	}
    22  	return
    23  }
    24  
    25  func (c *CombinedReadWriteCloser) Read(p []byte) (n int, err error) {
    26  	if c.Reader == nil {
    27  		err = fmt.Errorf("combined reader is nil")
    28  		return
    29  	}
    30  	n, err = c.Reader.Read(p)
    31  	return
    32  }
    33  
    34  func (c *CombinedReadWriteCloser) Write(p []byte) (n int, err error) {
    35  	if c.Writer == nil {
    36  		err = fmt.Errorf("combined writer is nil")
    37  		return
    38  	}
    39  	n, err = c.Writer.Write(p)
    40  	return
    41  }
    42  
    43  // Close will close Closer
    44  func (c *CombinedReadWriteCloser) Close() (err error) {
    45  	if c.Closer != nil {
    46  		err = c.Closer.Close()
    47  	}
    48  	return
    49  }