minor: methods place swap
Vladimir Bauer
3 years ago
| 215 | 215 | <-p.shutdown |
| 216 | 216 | } |
| 217 | 217 | |
| 218 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { | |
| 219 | var err error | |
| 220 | render := func() error { return s.render(cw) } | |
| 221 | tickerC := s.newTicker(p.ctx, cw.IsTerminal(), p.done) | |
| 222 | ||
| 223 | go s.hm.run() | |
| 224 | ||
| 225 | for { | |
| 226 | select { | |
| 227 | case op := <-p.operateState: | |
| 228 | op(s) | |
| 229 | case fn := <-p.interceptIO: | |
| 230 | fn(cw) | |
| 231 | case <-tickerC: | |
| 232 | e := render() | |
| 233 | if e != nil { | |
| 234 | p.cancel() // cancel all bars | |
| 235 | render = func() error { return nil } | |
| 236 | err = e | |
| 237 | } | |
| 238 | case <-p.done: | |
| 239 | update := make(chan bool) | |
| 240 | for err == nil { | |
| 241 | s.hm.state(update) | |
| 242 | if <-update { | |
| 243 | err = render() | |
| 244 | } else { | |
| 245 | break | |
| 246 | } | |
| 247 | } | |
| 248 | if err != nil { | |
| 249 | _, _ = fmt.Fprintln(s.debugOut, err.Error()) | |
| 250 | } | |
| 251 | s.hm.end(s.shutdownNotifier) | |
| 252 | close(p.shutdown) | |
| 253 | return | |
| 254 | } | |
| 255 | } | |
| 256 | } | |
| 257 | ||
| 218 | 258 | func (s *pState) newTicker(ctx context.Context, isTerminal bool, done chan struct{}) chan time.Time { |
| 219 | 259 | ch := make(chan time.Time, 1) |
| 220 | 260 | go func() { |
| 246 | 286 | return ch |
| 247 | 287 | } |
| 248 | 288 | |
| 249 | func (p *Progress) serve(s *pState, cw *cwriter.Writer) { | |
| 250 | var err error | |
| 251 | render := func() error { return s.render(cw) } | |
| 252 | tickerC := s.newTicker(p.ctx, cw.IsTerminal(), p.done) | |
| 253 | ||
| 254 | go s.hm.run() | |
| 255 | ||
| 256 | for { | |
| 257 | select { | |
| 258 | case op := <-p.operateState: | |
| 259 | op(s) | |
| 260 | case fn := <-p.interceptIO: | |
| 261 | fn(cw) | |
| 262 | case <-tickerC: | |
| 263 | e := render() | |
| 264 | if e != nil { | |
| 265 | p.cancel() // cancel all bars | |
| 266 | render = func() error { return nil } | |
| 267 | err = e | |
| 268 | } | |
| 269 | case <-p.done: | |
| 270 | update := make(chan bool) | |
| 271 | for err == nil { | |
| 272 | s.hm.state(update) | |
| 273 | if <-update { | |
| 274 | err = render() | |
| 275 | } else { | |
| 276 | break | |
| 277 | } | |
| 278 | } | |
| 279 | if err != nil { | |
| 280 | _, _ = fmt.Fprintln(s.debugOut, err.Error()) | |
| 281 | } | |
| 282 | s.hm.end(s.shutdownNotifier) | |
| 283 | close(p.shutdown) | |
| 284 | return | |
| 285 | } | |
| 286 | } | |
| 287 | } | |
| 288 | ||
| 289 | 289 | func (s *pState) render(cw *cwriter.Writer) (err error) { |
| 290 | 290 | var width, height int |
| 291 | 291 | if cw.IsTerminal() { |