go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/fu/iocopy.go (about)

     1  package fu
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  )
     7  
     8  type CopyProgress func(count int)
     9  type CopyBufferSize int
    10  
    11  func Copy(writer io.Writer, reader io.Reader, opts ...interface{}) (count int, err error) {
    12  	cp := IfsOption(CopyProgress(func(int) {}), opts).(CopyProgress)
    13  	size := IntOption(CopyBufferSize(32*1024), opts)
    14  	buf := make([]byte, size)
    15  	for {
    16  		if nr, er := reader.Read(buf); nr > 0 {
    17  			var nw int
    18  			if nw, err = writer.Write(buf[0:nr]); err != nil {
    19  				return
    20  			}
    21  			if nw > 0 {
    22  				count += nw
    23  			}
    24  			if nr != nw {
    25  				err = fmt.Errorf("short write")
    26  				return
    27  			}
    28  			cp(count)
    29  		} else if er != nil {
    30  			if er != io.EOF {
    31  				err = er
    32  			}
    33  			return
    34  		}
    35  	}
    36  }