refactoring render error handling
Vladimir Bauer
2 years ago
| 260 | 260 | |
| 261 | 261 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { |
| 262 | 262 | defer p.pwg.Done() |
| 263 | render := func() error { return s.render(cw) } | |
| 264 | 263 | var err error |
| 265 | 264 | var renderReq <-chan time.Time |
| 266 | 265 | |
| 274 | 273 | renderReq = s.renderReq |
| 275 | 274 | s.delayRC = nil |
| 276 | 275 | case <-renderReq: |
| 277 | e := render() | |
| 278 | if e != nil { | |
| 276 | err = s.render(cw) | |
| 277 | if err != nil { | |
| 278 | go func() { | |
| 279 | for { | |
| 280 | select { | |
| 281 | case <-s.renderReq: | |
| 282 | case <-p.done: | |
| 283 | return | |
| 284 | } | |
| 285 | } | |
| 286 | }() | |
| 279 | 287 | p.cancel() // cancel all bars |
| 280 | render = func() error { return nil } | |
| 281 | err = e | |
| 288 | renderReq = nil | |
| 282 | 289 | } |
| 283 | 290 | case <-p.done: |
| 284 | 291 | update := make(chan bool) |
| 285 | 292 | for s.autoRefresh && err == nil { |
| 286 | 293 | s.hm.state(update) |
| 287 | 294 | if <-update { |
| 288 | err = render() | |
| 295 | err = s.render(cw) | |
| 289 | 296 | } else { |
| 290 | 297 | break |
| 291 | 298 | } |