continue on write err, so all decorators are invoked
Vladimir Bauer
3 years ago
| 490 | 490 | return io.MultiReader(r, strings.NewReader("\n")), nil |
| 491 | 491 | } |
| 492 | 492 | |
| 493 | func (s *bState) drawImpl(stat decor.Statistics) (r io.Reader, err error) { | |
| 493 | func (s *bState) drawImpl(stat decor.Statistics) (io.Reader, error) { | |
| 494 | 494 | type decorResult struct { |
| 495 | 495 | width int |
| 496 | 496 | truncate bool |
| 497 | } | |
| 498 | decorFiller := func(buf *bytes.Buffer, decorators []decor.Decorator) (res decorResult, err error) { | |
| 497 | err error | |
| 498 | } | |
| 499 | decorFiller := func(buf *bytes.Buffer, decorators []decor.Decorator) (res decorResult) { | |
| 499 | 500 | res.width = stat.AvailableWidth |
| 500 | 501 | for _, d := range decorators { |
| 501 | 502 | str := d.Decor(stat) |
| 502 | if stat.AvailableWidth > 0 && err == nil { | |
| 503 | if stat.AvailableWidth > 0 { | |
| 503 | 504 | stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str)) |
| 504 | _, err = buf.WriteString(str) | |
| 505 | if res.err == nil { | |
| 506 | _, res.err = buf.WriteString(str) | |
| 507 | } | |
| 505 | 508 | } |
| 506 | 509 | } |
| 507 | 510 | res.truncate = stat.AvailableWidth < 0 |
| 508 | return res, err | |
| 509 | } | |
| 511 | return res | |
| 512 | } | |
| 513 | ||
| 510 | 514 | bufP, bufB, bufA := s.buffers[0], s.buffers[1], s.buffers[2] |
| 511 | 515 | |
| 512 | resP, err := decorFiller(bufP, s.pDecorators) | |
| 513 | if err != nil { | |
| 514 | return nil, err | |
| 515 | } | |
| 516 | ||
| 517 | resA, err := decorFiller(bufA, s.aDecorators) | |
| 518 | if err != nil { | |
| 519 | return nil, err | |
| 516 | resP := decorFiller(bufP, s.pDecorators) | |
| 517 | resA := decorFiller(bufA, s.aDecorators) | |
| 518 | ||
| 519 | for _, err := range []error{resP.err, resA.err} { | |
| 520 | if err != nil { | |
| 521 | return nil, err | |
| 522 | } | |
| 520 | 523 | } |
| 521 | 524 | |
| 522 | 525 | if resP.truncate { |
| 547 | 550 | } |
| 548 | 551 | } |
| 549 | 552 | } else { |
| 550 | err = s.filler.Fill(bufB, stat) | |
| 553 | err := s.filler.Fill(bufB, stat) | |
| 551 | 554 | if err != nil { |
| 552 | 555 | return nil, err |
| 553 | 556 | } |