Skip to main content

codetether_agent/tui/ui/chat_view/
entries.rs

1//! Per-message rendering loop (tool panels, chat messages).
2
3use ratatui::text::Line;
4
5use crate::tui::color_palette::ColorPalette;
6use crate::tui::message_formatter::MessageFormatter;
7use crate::tui::ui::tool_panel::{RenderEntry, build_tool_activity_panel, render_chat_message};
8
9use super::entry_result::EntryAppendResult;
10use super::separator::push_separator;
11
12/// Render separators, tool panels, and chat messages.
13/// Returns [`EntryAppendResult`] tracking deepest tool-panel scroll.
14///
15/// # Examples
16///
17/// ```rust,no_run
18/// # use codetether_agent::tui::ui::chat_view::entries::append_entries;
19/// # fn d(l:&mut Vec<ratatui::text::Line>,e:&[codetether_agent::tui::ui::tool_panel::RenderEntry],f:&codetether_agent::tui::message_formatter::MessageFormatter,p:&codetether_agent::tui::color_palette::ColorPalette){ let r=append_entries(l,e,40,36,0,f,p); }
20/// ```
21pub fn append_entries(
22    lines: &mut Vec<Line<'static>>,
23    entries: &[RenderEntry<'_>],
24    separator_width: usize,
25    panel_width: usize,
26    tool_preview_scroll: usize,
27    formatter: &MessageFormatter,
28    palette: &ColorPalette,
29) -> EntryAppendResult {
30    let mut tool_preview_max_scroll = 0;
31    for (idx, entry) in entries.iter().enumerate() {
32        if idx > 0 {
33            push_separator(lines, entry, separator_width);
34        }
35        if !entry.tool_activity.is_empty() {
36            let panel =
37                build_tool_activity_panel(&entry.tool_activity, tool_preview_scroll, panel_width);
38            tool_preview_max_scroll = tool_preview_max_scroll.max(panel.max_scroll);
39            lines.extend(panel.lines);
40            if entry.message.is_some() {
41                lines.push(Line::from(""));
42            }
43        }
44        if let Some(message) = entry.message {
45            render_chat_message(lines, message, formatter, palette);
46            lines.push(Line::from(""));
47        }
48    }
49    EntryAppendResult {
50        tool_preview_max_scroll,
51    }
52}