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 }