https://github.com/etienne-napoleone/spinach
🥬 Practical spinner for Rust
https://github.com/etienne-napoleone/spinach
cli no-dependencies rust spinner terminal-ui
Last synced: 4 days ago
JSON representation
🥬 Practical spinner for Rust
- Host: GitHub
- URL: https://github.com/etienne-napoleone/spinach
- Owner: etienne-napoleone
- License: mit
- Created: 2022-03-22T12:03:03.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2025-10-20T09:25:01.000Z (14 days ago)
- Last Synced: 2025-10-20T11:25:05.782Z (14 days ago)
- Topics: cli, no-dependencies, rust, spinner, terminal-ui
- Language: Rust
- Homepage: https://docs.rs/spinach/latest/spinach/
- Size: 144 KB
- Stars: 116
- Watchers: 1
- Forks: 4
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-rust - etienne-napoleone/spinach - napoleone/spinach/actions/workflows/ci.yml/badge.svg)](https://github.com/etienne-napoleone/spinach/actions/workflows/ci.yml) (Libraries / Command-line)
- awesome-rust-cn - etienne-napoleone/spinach
- awesome-rust - etienne-napoleone/spinach - Practical spinner. [](https://github.com/etienne-napoleone/spinach/actions/workflows/ci.yml) (Libraries / Command-line)
- fucking-awesome-rust - etienne-napoleone/spinach - Practical spinner. [](https://github.com/etienne-napoleone/spinach/actions/workflows/ci.yml) (Libraries / Command-line)
- fucking-awesome-rust - etienne-napoleone/spinach - Practical spinner. [](https://github.com/etienne-napoleone/spinach/actions/workflows/ci.yml) (Libraries / Command-line)
README
# 🥬 spinach
[](https://crates.io/crates/spinach)
[](https://docs.rs/spinach)
[](LICENSE)
[](https://github.com/etienne-napoleone/spinach/actions/workflows/ci.yml)
> Practical spinner for Rust — `v3` now with method chaining
## Install
Add as a dependency to your `Cargo.toml`.
```toml
[dependencies]
spinach = "3"
```
## Usage
Basic example.
```rust
use spinach::Spinner;
fn main() {
// Cut spinaches
let s = Spinner::new("Cutting spinaches...").start();
// Cut tomatoes
s.text("Cutting tomatoes...").update();
// We're done!
s.text("Vegetables cut").symbol("🔪").stop();
}
```
### Starting
```rust
use spinach::{Color, Spinner};
// With custom text
let s = Spinner::new("workin'...").start();
// With custom text, spinner, spinner speed and spinner color
let symbols = vec!["▮","▯"];
let s = Spinner::new("blip... blop...")
.color(Color::Red)
.symbols(symbols)
.frames_duration(80)
.start();
```
### Updating
```rust
use spinach::{Color, Spinner};
let s = Spinner::new("workin'...").start();
// Updating text
s.text("new text").update();
// Updating color
s.color(Color::White).update();
// Updating spinner symbols
s.symbols(vec!["◐", "◓", "◑", "◒"]).update();
// Updating spinner speed
s.frames_duration(80).update();
// Updating multiple at once
s.text("new text").color(Color::Red).update();
```
### Stopping
```rust
use spinach::{Color, Spinner};
let s = Spinner::new("workin'...").start();
// Stop with final `✔` frame and green color.
s.text("gg!").success();
// Stop with final `✖` frame and red color.
s.text("ups").failure();
// Stop with final `⚠` frame and yellow color.
s.text("something may have happened?").warn();
// Stop with without further modification (outside of chained updates).
s.text("notice").stop();
// Stop current spinner (sends update at the same time)
s.stop(); // freeze
s.text("spinach'd").symbol("🥬").stop(); // stop with the text "spinach'd" and a vegetable as the spinner
```
## FAQ
### How to avoid leaving terminal without prompt on interupt (ctrl^c)?
You can use a library like [`ctrlc`](https://crates.io/crates/ctrlc) to handle interupts.
The most basic way to handle it would be in conjuction with this lib QoL `show_cursor` function like this:
```rust
use spinach::{show_cursor, Spinner};
fn main() {
ctrlc::set_handler(|| {
show_cursor();
std::process::exit(0);
})
.expect("Error setting Ctrl-C handler");
let s = Spinner::new("workin'...").start();
// ...
```
## Related
Inspired by:
- [ora](https://github.com/sindresorhus/ora)
- [spinners](https://github.com/FGRibreau/spinners)