Hmbown/CodeWhale · error

code rows are never empty

Error message

code rows are never empty

What it means

render_wrapped_code_spans_tagged seeds rows with one empty Vec and only pushes additional rows, never popping, so at least one row always exists when it finishes wrapping code-span graphemes. The expect fires only if row-initialization logic regressed and all rows were drained — an internal rendering invariant, independent of input span content.

Source

Thrown at crates/tui/src/tui/markdown_render.rs:1280

fn render_wrapped_code_spans_tagged(
    spans: Vec<Span<'static>>,
    width: usize,
) -> Vec<RenderedMarkdownLine> {
    let prefix = "  ";
    let prefix_width = prefix.width();
    let available = width.saturating_sub(prefix_width).max(1);
    let mut rows: Vec<Vec<(String, Style)>> = vec![Vec::new()];
    let mut current_width = 0usize;

    for span in spans {
        for grapheme in span.content.graphemes(true) {
            let grapheme_width = markdown_grapheme_width(grapheme, current_width);
            if current_width + grapheme_width > available && current_width > 0 {
                rows.push(Vec::new());
                current_width = 0;
            }
            let row = rows.last_mut().expect("code rows are never empty");
            if let Some((text, style)) = row.last_mut()
                && *style == span.style
            {
                text.push_str(grapheme);
            } else {
                row.push((grapheme.to_string(), span.style));
            }
            current_width += markdown_grapheme_width(grapheme, current_width);
        }
    }

    let last_index = rows.len().saturating_sub(1);
    rows.into_iter()
        .enumerate()
        .map(|(idx, row)| {
            let mut rendered = vec![Span::raw(prefix)];
            rendered.extend(
                row.into_iter()

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Keep the vec![Vec::new()] seed; append rows instead of replacing the vector
  2. If empty input should yield zero rows, change the function to return Option rather than expecting
  3. Add a test for empty spans producing exactly one (empty) row
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at crates/tui/src/tui/markdown_render.rs:1280 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/73ba84b729ab6354. Report an issue: GitHub.