diff --git a/progress.go b/progress.go index 45d0c6e..76dc168 100644 --- a/progress.go +++ b/progress.go @@ -216,6 +216,46 @@ <-p.shutdown } +func (p *Progress) serve(s *pState, cw *cwriter.Writer) { + var err error + render := func() error { return s.render(cw) } + tickerC := s.newTicker(p.ctx, cw.IsTerminal(), p.done) + + go s.hm.run() + + for { + select { + case op := <-p.operateState: + op(s) + case fn := <-p.interceptIO: + fn(cw) + case <-tickerC: + e := render() + if e != nil { + p.cancel() // cancel all bars + render = func() error { return nil } + err = e + } + case <-p.done: + update := make(chan bool) + for err == nil { + s.hm.state(update) + if <-update { + err = render() + } else { + break + } + } + if err != nil { + _, _ = fmt.Fprintln(s.debugOut, err.Error()) + } + s.hm.end(s.shutdownNotifier) + close(p.shutdown) + return + } + } +} + func (s *pState) newTicker(ctx context.Context, isTerminal bool, done chan struct{}) chan time.Time { ch := make(chan time.Time, 1) go func() { @@ -247,46 +287,6 @@ return ch } -func (p *Progress) serve(s *pState, cw *cwriter.Writer) { - var err error - render := func() error { return s.render(cw) } - tickerC := s.newTicker(p.ctx, cw.IsTerminal(), p.done) - - go s.hm.run() - - for { - select { - case op := <-p.operateState: - op(s) - case fn := <-p.interceptIO: - fn(cw) - case <-tickerC: - e := render() - if e != nil { - p.cancel() // cancel all bars - render = func() error { return nil } - err = e - } - case <-p.done: - update := make(chan bool) - for err == nil { - s.hm.state(update) - if <-update { - err = render() - } else { - break - } - } - if err != nil { - _, _ = fmt.Fprintln(s.debugOut, err.Error()) - } - s.hm.end(s.shutdownNotifier) - close(p.shutdown) - return - } - } -} - func (s *pState) render(cw *cwriter.Writer) (err error) { var width, height int if cw.IsTerminal() {