refactoring: bar filler
Vladimir Bauer
3 years ago
| 147 | 147 | return bf |
| 148 | 148 | } |
| 149 | 149 | |
| 150 | func (s *bFiller) Fill(w io.Writer, stat decor.Statistics) { | |
| 150 | func (s *bFiller) Fill(w io.Writer, stat decor.Statistics) (err error) { | |
| 151 | 151 | width := internal.CheckRequestedWidth(stat.RequestedWidth, stat.AvailableWidth) |
| 152 | 152 | brackets := s.components[iLbound].width + s.components[iRbound].width |
| 153 | 153 | // don't count brackets as progress |
| 154 | 154 | width -= brackets |
| 155 | 155 | if width < 0 { |
| 156 | return | |
| 157 | } | |
| 158 | ||
| 159 | mustWrite(w, s.components[iLbound].bytes) | |
| 160 | defer mustWrite(w, s.components[iRbound].bytes) | |
| 156 | return nil | |
| 157 | } | |
| 158 | ||
| 159 | _, err = w.Write(s.components[iLbound].bytes) | |
| 160 | if err != nil { | |
| 161 | return err | |
| 162 | } | |
| 163 | defer func() { | |
| 164 | if err == nil { | |
| 165 | _, err = w.Write(s.components[iRbound].bytes) | |
| 166 | } | |
| 167 | }() | |
| 161 | 168 | |
| 162 | 169 | if width == 0 { |
| 163 | return | |
| 170 | return nil | |
| 164 | 171 | } |
| 165 | 172 | |
| 166 | 173 | var filling [][]byte |
| 229 | 236 | } |
| 230 | 237 | |
| 231 | 238 | if s.rev { |
| 232 | flush(w, padding, filling) | |
| 233 | } else { | |
| 234 | flush(w, filling, padding) | |
| 235 | } | |
| 236 | } | |
| 237 | ||
| 238 | func flush(w io.Writer, filling, padding [][]byte) { | |
| 239 | return flush(w, padding, filling) | |
| 240 | } | |
| 241 | return flush(w, filling, padding) | |
| 242 | } | |
| 243 | ||
| 244 | func flush(w io.Writer, filling, padding [][]byte) error { | |
| 239 | 245 | for i := len(filling) - 1; i >= 0; i-- { |
| 240 | mustWrite(w, filling[i]) | |
| 246 | _, err := w.Write(filling[i]) | |
| 247 | if err != nil { | |
| 248 | return err | |
| 249 | } | |
| 241 | 250 | } |
| 242 | 251 | for i := 0; i < len(padding); i++ { |
| 243 | mustWrite(w, padding[i]) | |
| 244 | } | |
| 245 | } | |
| 246 | ||
| 247 | func mustWrite(w io.Writer, p []byte) { | |
| 248 | _, err := w.Write(p) | |
| 249 | if err != nil { | |
| 250 | panic(err) | |
| 251 | } | |
| 252 | } | |
| 252 | _, err := w.Write(padding[i]) | |
| 253 | if err != nil { | |
| 254 | return err | |
| 255 | } | |
| 256 | } | |
| 257 | return nil | |
| 258 | } | |