progress.go raw
1 package utils
2
3 // ProgressEventType defines transfer progress event type
4 type ProgressEventType int
5
6 const (
7 // TransferStartedEvent transfer started, set TotalBytes
8 TransferStartedEvent ProgressEventType = 1 + iota
9 // TransferDataEvent transfer data, set ConsumedBytes anmd TotalBytes
10 TransferDataEvent
11 // TransferCompletedEvent transfer completed
12 TransferCompletedEvent
13 // TransferFailedEvent transfer encounters an error
14 TransferFailedEvent
15 )
16
17 // ProgressEvent defines progress event
18 type ProgressEvent struct {
19 ConsumedBytes int64
20 TotalBytes int64
21 RwBytes int64
22 EventType ProgressEventType
23 }
24
25 // ProgressListener listens progress change
26 type ProgressListener interface {
27 ProgressChanged(event *ProgressEvent)
28 }
29
30 // -------------------- Private --------------------
31
32 func NewProgressEvent(eventType ProgressEventType, consumed, total int64, rwBytes int64) *ProgressEvent {
33 return &ProgressEvent{
34 ConsumedBytes: consumed,
35 TotalBytes: total,
36 RwBytes: rwBytes,
37 EventType: eventType}
38 }
39
40 // publishProgress
41 func PublishProgress(listener ProgressListener, event *ProgressEvent) {
42 if listener != nil && event != nil {
43 listener.ProgressChanged(event)
44 }
45 }
46
47 func GetProgressListener(obj interface{}) ProgressListener {
48 if obj == nil {
49 return nil
50 }
51 listener, ok := obj.(ProgressListener)
52 if !ok {
53 return nil
54 }
55 return listener
56 }
57
58 type ReaderTracker struct {
59 CompletedBytes int64
60 }
61