Rattles is a minimal, dependency-free terminal spinner library for Rust. It makes no assumptions about how the output will be used.
cargo add rattlesuse std::{io::Write, time::Duration};
use rattles::presets::prelude as presets;
fn main() {
let rattle = presets::waverows();
// change default interval
// let rattle = presets::waverows().set_interval(Duration::from_millis(100));
// reverse direction
// let rattle = presets::waverows().reverse();
loop {
print!("\r{}", rattle.current_frame());
std::io::stdout().flush().unwrap();
std::thread::sleep(Duration::from_millis(20));
}
}rattle!(
Custom, // struct name
custom, // method name
1, // row count (width of the spinner)
100, // interval in milliseconds
["⣾", "⣷", "⣯", "⣟", "⣻", "⣽", "⣾"] // keyframes
)rattles enables the std feature by default. To opt out:
cargo add rattles --no-default-featuresWithout std, the global clock is unavailable. Animations can still be driven three ways:
- Time-based, with an external clock:
rattle.frame_at(elapsed)
- Index-based:
rattle.frame(n)
- Tick-based:
Note that
let mut rattle = presets::dots().into_ticked(); rattle.tick(); let frame = rattle.current_frame();
TickedRattleris stateful and must be stored outside the render loop.
Built-in presets are organized by category:
presets::arrowspresets::asciipresets::braillepresets::emoji
A prelude is available rattles::prelude.
Rattles includes spinners sourced from these wonderful projects. We gratefully acknowledge their work.