Codebase list golang-github-vbauerster-mpb / e476c60
drawImpl returns error Vladimir Bauer 3 years ago
1 changed file(s) with 57 addition(s) and 40 deletion(s). Raw diff Collapse all Expand all
450450 }
451451
452452 func (s *bState) draw(stat decor.Statistics) io.Reader {
453 return io.MultiReader(s.drawImpl(stat), strings.NewReader("\n"))
454 }
455
456 func (s *bState) drawImpl(stat decor.Statistics) io.Reader {
457 decorFiller := func(buf *bytes.Buffer, decorators []decor.Decorator) (int, bool) {
458 tw := stat.AvailableWidth
453 r, err := s.drawImpl(stat)
454 if err != nil {
455 s.buffers[0].Reset()
456 s.buffers[1].Reset()
457 s.buffers[2].Reset()
458 panic(err)
459 }
460 return io.MultiReader(r, strings.NewReader("\n"))
461 }
462
463 func (s *bState) drawImpl(stat decor.Statistics) (r io.Reader, err error) {
464 type decorResult struct {
465 width int
466 truncate bool
467 }
468 decorFiller := func(buf *bytes.Buffer, decorators []decor.Decorator) (res decorResult, err error) {
469 res.width = stat.AvailableWidth
459470 for _, d := range decorators {
460471 str := d.Decor(stat)
461 if stat.AvailableWidth > 0 {
472 if stat.AvailableWidth > 0 && err == nil {
462473 stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str))
463 mustWriteString(buf, str)
464 }
465 }
466 return tw, stat.AvailableWidth < 0
467 }
468
474 _, err = buf.WriteString(str)
475 }
476 }
477 res.truncate = stat.AvailableWidth < 0
478 return res, err
479 }
469480 bufP, bufB, bufA := s.buffers[0], s.buffers[1], s.buffers[2]
470481
471 twP, truncateP := decorFiller(bufP, s.pDecorators)
482 resP, err := decorFiller(bufP, s.pDecorators)
483 if err != nil {
484 return nil, err
485 }
472486
473487 if !s.trimSpace && stat.AvailableWidth >= 2 {
474 mustWriteString(bufB, " ")
475 defer mustWriteString(bufB, " ")
488 err = bufB.WriteByte(' ')
489 if err != nil {
490 return nil, err
491 }
492 defer func() {
493 if err == nil {
494 err = bufB.WriteByte(' ')
495 }
496 }()
476497 stat.AvailableWidth -= 2
477498 }
478499
479 twA, truncateA := decorFiller(bufA, s.aDecorators)
480
481 if truncateP {
482 trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(bufP.String()), twP, "…"))
500 resA, err := decorFiller(bufA, s.aDecorators)
501 if err != nil {
502 return nil, err
503 }
504
505 if resP.truncate {
506 trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(bufP.String()), resP.width, "…"))
483507 bufP.Reset()
484 return trunc
485 }
486
487 if truncateA {
488 trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(bufA.String()), twA, "…"))
508 return trunc, nil
509 }
510
511 if resA.truncate {
512 trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(bufA.String()), resA.width, "…"))
489513 bufA.Reset()
490 return io.MultiReader(bufP, bufB, trunc)
491 }
492
493 err := s.filler.Fill(bufB, stat)
514 return io.MultiReader(bufP, bufB, trunc), nil
515 }
516
517 err = s.filler.Fill(bufB, stat)
494518 if err != nil {
495 panic(err)
496 }
497
498 return io.MultiReader(bufP, bufB, bufA)
519 return nil, err
520 }
521
522 return io.MultiReader(bufP, bufB, bufA), nil
499523 }
500524
501525 func (s *bState) wSyncTable() [][]chan int {
610634 }
611635 return d
612636 }
613
614 func mustWriteString(sw io.StringWriter, str string) {
615 _, err := sw.WriteString(str)
616 if err != nil {
617 panic(err)
618 }
619 }