recursive/tui/ui/
spinner.rs1pub const FRAMES: [&str; 10] = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
11
12pub fn frame_char(index: usize) -> &'static str {
15 FRAMES[index % FRAMES.len()]
16}
17
18pub fn format_line(index: usize, verb: &str, elapsed_secs: f64) -> String {
20 format!("{} {} {:.1}s", frame_char(index), verb, elapsed_secs)
21}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26
27 #[test]
28 fn spinner_frame_advances_with_index() {
29 assert_eq!(frame_char(0), "⠋");
30 assert_eq!(frame_char(1), "⠙");
31 assert_eq!(frame_char(9), "⠏");
32 assert_eq!(frame_char(10), "⠋");
34 assert_eq!(frame_char(20), "⠋");
35 }
36
37 #[test]
38 fn format_line_includes_verb_and_elapsed() {
39 let line = format_line(0, "Thinking", 2.34);
40 assert!(line.contains("Thinking"));
41 assert!(line.contains("2.3s"));
42 assert!(line.starts_with('⠋'));
43 }
44}