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