pub const SPINNER_FRAMES: [&str; 10] = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
pub fn format_spinner(frame: usize, secs: f32, label: &str, chars: usize) -> String {
let braille = SPINNER_FRAMES[frame % SPINNER_FRAMES.len()];
if chars == 0 {
format!("{braille} {label} {secs:.1}s")
} else {
format!("{braille} {label} {secs:.1}s · {chars} chars")
}
}
#[cfg(test)]
mod tests {
use super::{format_spinner, SPINNER_FRAMES};
#[test]
fn spinner_line_formats_and_frame_wraps() {
assert_eq!(
format_spinner(0, 1.23, "thinking…", 340),
"⠋ thinking… 1.2s · 340 chars"
);
assert_eq!(
format_spinner(1, 0.5, "compressing context…", 0),
"⠙ compressing context… 0.5s"
);
assert!(
format_spinner(SPINNER_FRAMES.len(), 0.0, "thinking…", 0).contains(SPINNER_FRAMES[0])
);
}
#[test]
fn frame_set_is_the_ten_braille_glyphs() {
assert_eq!(SPINNER_FRAMES.len(), 10);
assert_eq!(SPINNER_FRAMES[0], "⠋");
assert!(
SPINNER_FRAMES.iter().all(|f| f.chars().count() == 1
&& ('\u{2800}'..='\u{28FF}')
.contains(&f.chars().next().expect("one glyph per frame"))),
"every frame is a single braille glyph: {SPINNER_FRAMES:?}"
);
}
}