github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/utils/iocloser.go (about)

     1  package utils
     2  
     3  import "io"
     4  
     5  type readCloser struct {
     6  	io.Reader
     7  	c func() error
     8  }
     9  
    10  type writeCloser struct {
    11  	io.Writer
    12  	c func() error
    13  }
    14  
    15  // ReadCloser returns an io.ReadCloser from a io.Reader and a close method.
    16  func ReadCloser(r io.Reader, c func() error) io.ReadCloser {
    17  	return &readCloser{r, c}
    18  }
    19  
    20  func (r *readCloser) Read(p []byte) (int, error) {
    21  	return r.Reader.Read(p)
    22  }
    23  
    24  func (r *readCloser) Close() error {
    25  	if r.c != nil {
    26  		return r.c()
    27  	}
    28  	return nil
    29  }
    30  
    31  // WriteCloser returns an io.WriteCloser from a io.Writer and a close method.
    32  func WriteCloser(w io.Writer, c func() error) io.WriteCloser {
    33  	return &writeCloser{w, c}
    34  }
    35  
    36  func (w *writeCloser) Read(p []byte) (int, error) {
    37  	return w.Writer.Write(p)
    38  }
    39  
    40  func (w *writeCloser) Close() error {
    41  	if w.c != nil {
    42  		return w.c()
    43  	}
    44  	return nil
    45  }