use ratatui::text::Line;
impl super::AppState {
pub(crate) fn is_message_cache_valid(&self, max_width: usize) -> bool {
self.cached_messages_len == self.messages.len()
&& self.cached_max_width == max_width
&& self.cached_streaming_snapshot.as_deref() == Some(&self.streaming_text)
&& self.cached_processing == self.processing
}
pub fn get_or_build_message_lines(&mut self, max_width: usize) -> Option<Vec<Line<'static>>> {
if self.is_message_cache_valid(max_width) && !self.cached_message_lines.is_empty() {
Some(self.cached_message_lines.clone())
} else {
None
}
}
pub(crate) fn take_cached_message_lines(&mut self) -> Vec<Line<'static>> {
self.cached_message_lines.drain(..).collect()
}
pub(crate) fn store_message_lines(&mut self, lines: Vec<Line<'static>>, max_width: usize) {
self.cached_message_lines = lines;
self.cached_messages_len = self.messages.len();
self.cached_max_width = max_width;
self.cached_streaming_snapshot = if self.processing {
Some(self.streaming_text.clone())
} else {
None
};
self.cached_processing = self.processing;
}
pub(crate) fn clone_frozen_prefix(&self, max_width: usize) -> Option<Vec<Line<'static>>> {
if self.cached_frozen_len == 0
|| self.cached_messages_len != self.messages.len()
|| self.cached_max_width != max_width
{
return None;
}
let frozen: Vec<Line<'static>> = self
.cached_message_lines
.iter()
.take(self.cached_frozen_len)
.cloned()
.collect();
if frozen.is_empty() {
None
} else {
Some(frozen)
}
}
pub(crate) fn store_message_lines_with_frozen(
&mut self,
lines: Vec<Line<'static>>,
max_width: usize,
frozen_len: usize,
) {
self.cached_frozen_len = frozen_len;
self.store_message_lines(lines, max_width);
}
}