drawImpl returns error
Vladimir Bauer
3 years ago
| 450 | 450 | } |
| 451 | 451 | |
| 452 | 452 | 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 | |
| 459 | 470 | for _, d := range decorators { |
| 460 | 471 | str := d.Decor(stat) |
| 461 | if stat.AvailableWidth > 0 { | |
| 472 | if stat.AvailableWidth > 0 && err == nil { | |
| 462 | 473 | 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 | } | |
| 469 | 480 | bufP, bufB, bufA := s.buffers[0], s.buffers[1], s.buffers[2] |
| 470 | 481 | |
| 471 | twP, truncateP := decorFiller(bufP, s.pDecorators) | |
| 482 | resP, err := decorFiller(bufP, s.pDecorators) | |
| 483 | if err != nil { | |
| 484 | return nil, err | |
| 485 | } | |
| 472 | 486 | |
| 473 | 487 | 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 | }() | |
| 476 | 497 | stat.AvailableWidth -= 2 |
| 477 | 498 | } |
| 478 | 499 | |
| 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, "…")) | |
| 483 | 507 | 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, "…")) | |
| 489 | 513 | 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) | |
| 494 | 518 | 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 | |
| 499 | 523 | } |
| 500 | 524 | |
| 501 | 525 | func (s *bState) wSyncTable() [][]chan int { |
| 610 | 634 | } |
| 611 | 635 | return d |
| 612 | 636 | } |
| 613 | ||
| 614 | func mustWriteString(sw io.StringWriter, str string) { | |
| 615 | _, err := sw.WriteString(str) | |
| 616 | if err != nil { | |
| 617 | panic(err) | |
| 618 | } | |
| 619 | } | |