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}) }