dotcloud/docker

View on GitHub
pkg/progress/progress.go

Summary

Maintainability
A
0 mins
Test Coverage
package progress // import "github.com/docker/docker/pkg/progress"

import (
    "fmt"
)

// Progress represents the progress of a transfer.
type Progress struct {
    ID string

    // Progress contains a Message or...
    Message string

    // ...progress of an action
    Action  string
    Current int64
    Total   int64

    // If true, don't show xB/yB
    HideCounts bool
    // If not empty, use units instead of bytes for counts
    Units string

    // Aux contains extra information not presented to the user, such as
    // digests for push signing.
    Aux interface{}

    LastUpdate bool
}

// Output is an interface for writing progress information. It's
// like a writer for progress, but we don't call it Writer because
// that would be confusing next to ProgressReader (also, because it
// doesn't implement the io.Writer interface).
type Output interface {
    WriteProgress(Progress) error
}

type chanOutput chan<- Progress

func (out chanOutput) WriteProgress(p Progress) error {
    // FIXME: workaround for panic in #37735
    defer func() {
        recover()
    }()
    out <- p
    return nil
}

// ChanOutput returns an Output that writes progress updates to the
// supplied channel.
func ChanOutput(progressChan chan<- Progress) Output {
    return chanOutput(progressChan)
}

type discardOutput struct{}

func (discardOutput) WriteProgress(Progress) error {
    return nil
}

// DiscardOutput returns an Output that discards progress
func DiscardOutput() Output {
    return discardOutput{}
}

// Update is a convenience function to write a progress update to the channel.
func Update(out Output, id, action string) {
    out.WriteProgress(Progress{ID: id, Action: action})
}

// Updatef is a convenience function to write a printf-formatted progress update
// to the channel.
func Updatef(out Output, id, format string, a ...interface{}) {
    Update(out, id, fmt.Sprintf(format, a...))
}

// Message is a convenience function to write a progress message to the channel.
func Message(out Output, id, message string) {
    out.WriteProgress(Progress{ID: id, Message: message})
}

// Messagef is a convenience function to write a printf-formatted progress
// message to the channel.
func Messagef(out Output, id, format string, a ...interface{}) {
    Message(out, id, fmt.Sprintf(format, a...))
}

// Aux sends auxiliary information over a progress interface, which will not be
// formatted for the UI. This is used for things such as push signing.
func Aux(out Output, a interface{}) {
    out.WriteProgress(Progress{Aux: a})
}