Codex Handbook
tui/src/render/line_utils.rs 60 lines
use ratatui::text::Line;use ratatui::text::Span;/// Clone a borrowed ratatui `Line` into an owned `'static` line.pub fn line_to_static(line: &Line<'_>) -> Line<'static> {    Line {        style: line.style,        alignment: line.alignment,        spans: line            .spans            .iter()            .map(|s| Span {                style: s.style,                content: std::borrow::Cow::Owned(s.content.to_string()),            })            .collect(),    }}/// Append owned copies of borrowed lines to `out`.pub fn push_owned_lines<'a>(src: &[Line<'a>], out: &mut Vec<Line<'static>>) {    for l in src {        out.push(line_to_static(l));    }}/// Consider a line blank if it has no spans or only spans whose contents are/// empty or consist solely of spaces (no tabs/newlines).#[cfg(test)]pub fn is_blank_line_spaces_only(line: &Line<'_>) -> bool {    if line.spans.is_empty() {        return true;    }    line.spans        .iter()        .all(|s| s.content.is_empty() || s.content.chars().all(|c| c == ' '))}/// Prefix each line with `initial_prefix` for the first line and/// `subsequent_prefix` for following lines. Returns a new Vec of owned lines.pub fn prefix_lines(    lines: Vec<Line<'static>>,    initial_prefix: Span<'static>,    subsequent_prefix: Span<'static>,) -> Vec<Line<'static>> {    lines        .into_iter()        .enumerate()        .map(|(i, l)| {            let mut spans = Vec::with_capacity(l.spans.len() + 1);            spans.push(if i == 0 {                initial_prefix.clone()            } else {                subsequent_prefix.clone()            });            spans.extend(l.spans);            Line::from(spans).style(l.style)        })        .collect()}