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 }