diff options
| -rw-r--r-- | drive/progress.go | 78 | ||||
| -rw-r--r-- | drive/util.go | 72 | 
2 files changed, 78 insertions, 72 deletions
| diff --git a/drive/progress.go b/drive/progress.go new file mode 100644 index 0000000..ee63b6c --- /dev/null +++ b/drive/progress.go @@ -0,0 +1,78 @@ +package drive + +import ( +    "io" +    "fmt" +    "time" +) + +type Progress struct { +    Writer io.Writer +    Reader io.Reader +    Size int64 +    progress int64 +    rate int64 +    rateProgress int64 +    rateUpdated time.Time +    updated time.Time +    done bool +} + +func (self *Progress) Read(p []byte) (int, error) { +    // Read +    n, err := self.Reader.Read(p) + +    now := time.Now() +    isLast := err != nil + +    // Increment progress +    newProgress := self.progress + int64(n) +    self.progress = newProgress + +    // Initialize rate state +    if self.rateUpdated.IsZero() { +        self.rateUpdated = now +        self.rateProgress = newProgress +    } + +    // Update rate every 3 seconds +    if self.rateUpdated.Add(time.Second * 3).Before(now) { +        self.rate = calcRate(newProgress - self.rateProgress, self.rateUpdated, now) +        self.rateUpdated = now +        self.rateProgress = newProgress +    } + +    // Draw progress every second +    if self.updated.Add(time.Second).Before(now) || isLast { +        self.Draw(isLast) +    } + +    // Update last draw time +    self.updated = now + +    // Mark as done if error occurs +    self.done = isLast + +    return n, err +} + +func (self *Progress) Draw(isLast bool) { +    if self.done { +        return +    } + +    // Clear line +    fmt.Fprintf(self.Writer, "\r%50s", "") + +    // Print progress +    fmt.Fprintf(self.Writer, "\r%s/%s", formatSize(self.progress, false), formatSize(self.Size, false)) + +    // Print rate +    if self.rate > 0 { +        fmt.Fprintf(self.Writer, ", Rate: %s/s", formatSize(self.rate, false)) +    } + +    if isLast { +        fmt.Fprintf(self.Writer, "\n") +    } +} diff --git a/drive/util.go b/drive/util.go index 4103b9d..8b3d171 100644 --- a/drive/util.go +++ b/drive/util.go @@ -1,7 +1,6 @@  package drive  import ( -    "io"      "os"      "fmt"      "strings" @@ -126,74 +125,3 @@ func fileExists(path string) bool {  func intMax() int64 {      return 1 << (strconv.IntSize - 1) - 1  } - -type Progress struct { -    Writer io.Writer -    Reader io.Reader -    Size int64 -    progress int64 -    rate int64 -    rateProgress int64 -    rateUpdated time.Time -    updated time.Time -    done bool -} - -func (self *Progress) Read(p []byte) (int, error) { -    // Read -    n, err := self.Reader.Read(p) - -    now := time.Now() -    isLast := err != nil - -    // Increment progress -    newProgress := self.progress + int64(n) -    self.progress = newProgress - -    // Initialize rate state -    if self.rateUpdated.IsZero() { -        self.rateUpdated = now -        self.rateProgress = newProgress -    } - -    // Update rate every 3 seconds -    if self.rateUpdated.Add(time.Second * 3).Before(now) { -        self.rate = calcRate(newProgress - self.rateProgress, self.rateUpdated, now) -        self.rateUpdated = now -        self.rateProgress = newProgress -    } - -    // Draw progress every second -    if self.updated.Add(time.Second).Before(now) || isLast { -        self.Draw(isLast) -    } - -    // Update last draw time -    self.updated = now - -    // Mark as done if error occurs -    self.done = isLast - -    return n, err -} - -func (self *Progress) Draw(isLast bool) { -    if self.done { -        return -    } - -    // Clear line -    fmt.Fprintf(self.Writer, "\r%50s", "") - -    // Print progress -    fmt.Fprintf(self.Writer, "\r%s/%s", formatSize(self.progress, false), formatSize(self.Size, false)) - -    // Print rate -    if self.rate > 0 { -        fmt.Fprintf(self.Writer, ", Rate: %s/s", formatSize(self.rate, false)) -    } - -    if isLast { -        fmt.Fprintf(self.Writer, "\n") -    } -} | 
