use super::thinking_verbs::{self, THINKING_VERBS};
pub const SPINNER_FRAMES: &[char] = &[
'\u{280b}', '\u{2819}', '\u{2839}', '\u{2838}', '\u{283c}', '\u{2834}', '\u{2826}', '\u{2827}', '\u{2807}', '\u{280f}', ];
pub const COMPACTION_CHAR: char = '\u{273b}';
pub const COMPLETED_CHAR: char = '\u{23fa}';
pub const CONTINUATION_CHAR: char = '\u{23bf}';
pub const SUCCESS_CHAR: char = '\u{2713}';
pub const FAILURE_CHAR: char = '\u{2717}';
pub const TREE_BRANCH: &str = "\u{251c}\u{2500}"; pub const TREE_LAST: &str = "\u{2514}\u{2500}"; pub const TREE_VERTICAL: &str = "\u{2502}";
#[derive(Debug, Clone)]
pub struct SpinnerState {
frame_index: usize,
tick_count: u64,
verb_index: usize,
verb_tick: u64,
}
impl SpinnerState {
pub fn new() -> Self {
Self {
frame_index: 0,
tick_count: 0,
verb_index: 0,
verb_tick: 0,
}
}
pub fn tick(&mut self) -> char {
let ch = SPINNER_FRAMES[self.frame_index];
self.frame_index = (self.frame_index + 1) % SPINNER_FRAMES.len();
self.tick_count += 1;
self.verb_tick += 1;
let current_verb = THINKING_VERBS[self.verb_index];
if self.verb_tick >= thinking_verbs::cycle_ticks_for(current_verb) {
self.verb_tick = 0;
self.verb_index = thinking_verbs::next_verb_index(self.verb_index);
}
ch
}
pub fn current(&self) -> char {
SPINNER_FRAMES[self.frame_index]
}
pub fn tick_count(&self) -> u64 {
self.tick_count
}
pub fn current_verb(&self) -> &'static str {
THINKING_VERBS[self.verb_index]
}
pub fn verb_fade_intensity(&self) -> f32 {
let verb = THINKING_VERBS[self.verb_index];
thinking_verbs::compute_fade_intensity(verb, self.verb_tick)
}
pub fn reset(&mut self) {
self.frame_index = 0;
self.tick_count = 0;
self.verb_index = 0;
self.verb_tick = 0;
}
}
impl Default for SpinnerState {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
#[path = "spinner_tests.rs"]
mod tests;