From b6c6436cee8c49deea8837a487d4e2b301047852 Mon Sep 17 00:00:00 2001 From: amorozov Date: Sat, 29 Jun 2024 00:33:08 +0300 Subject: [PATCH] feature: added io.Copy progress listener --- pkg/io/copy/progress/progress_listener.go | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 pkg/io/copy/progress/progress_listener.go diff --git a/pkg/io/copy/progress/progress_listener.go b/pkg/io/copy/progress/progress_listener.go new file mode 100644 index 0000000..6da6640 --- /dev/null +++ b/pkg/io/copy/progress/progress_listener.go @@ -0,0 +1,37 @@ +package progress + +import "io" + +type WriteProgressCallback func(uint64, uint64) + +type WriteProgressListener struct { + BytesWritten uint64 + ProgressCallback WriteProgressCallback +} + +func (self *WriteProgressListener) Write(p []byte) (int, error) { + n := len(p) + newTotal := self.BytesWritten + uint64(n) + + if self.ProgressCallback != nil { + self.ProgressCallback(self.BytesWritten, newTotal) + } + + self.BytesWritten = newTotal + return n, nil +} + +func (self *WriteProgressListener) WrapReader(reader io.Reader) io.Reader { + return io.TeeReader(reader, self) +} + +func NewProgressListener(callback WriteProgressCallback) *WriteProgressListener { + return &WriteProgressListener{ + BytesWritten: 0, + ProgressCallback: callback, + } +} + +func WrapReader(reader io.Reader, callback WriteProgressCallback) io.Reader { + return NewProgressListener(callback).WrapReader(reader) +}