39 lines
601 B
Go
39 lines
601 B
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
type GenericProgress struct {
|
||
|
Completed int64
|
||
|
Total int64
|
||
|
}
|
||
|
|
||
|
func (gp GenericProgress) Percentage() float64 {
|
||
|
if gp.Total == 0 {
|
||
|
return 0
|
||
|
}
|
||
|
return float64(gp.Completed) / float64(gp.Total)
|
||
|
}
|
||
|
|
||
|
var _ io.Writer = (*Progresser)(nil)
|
||
|
|
||
|
type Progresser struct {
|
||
|
Updates chan<- GenericProgress
|
||
|
Total int64
|
||
|
Running int64
|
||
|
}
|
||
|
|
||
|
func (pt *Progresser) Write(p []byte) (int, error) {
|
||
|
pt.Running += int64(len(p))
|
||
|
|
||
|
if pt.Updates != nil {
|
||
|
select {
|
||
|
case pt.Updates <- GenericProgress{Completed: pt.Running, Total: pt.Total}:
|
||
|
default:
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return len(p), nil
|
||
|
}
|