8 stable releases

3.1.0 May 7, 2025
3.0.0 Aug 23, 2024
2.1.0 Mar 26, 2022
1.2.0 Mar 24, 2022

#125 in Command-line interface

Download history 41/week @ 2025-06-04 84/week @ 2025-06-11 85/week @ 2025-06-18 113/week @ 2025-06-25 151/week @ 2025-07-02 107/week @ 2025-07-09 138/week @ 2025-07-16 145/week @ 2025-07-23 75/week @ 2025-07-30 215/week @ 2025-08-06 129/week @ 2025-08-13 163/week @ 2025-08-20 108/week @ 2025-08-27 228/week @ 2025-09-03 262/week @ 2025-09-10 83/week @ 2025-09-17

721 downloads per month
Used in 9 crates

MIT license

17KB
234 lines

🥬 spinach

Crates.io Docs.rs License CI

Practical spinner for Rust — v3 now with method chaining

Install

Add as a dependency to your Cargo.toml.

[dependencies]
spinach = "3"

Usage

Basic example.

use spinach::Spinner;

fn main() {
    let s = Spinner::new("Cutting spinaches...").start();
    // Cut spinaches
    s.text("Cutting tomatoes...").update();
    // Cut tomatoes
    s.text("Vegetables cut").symbol("🔪").stop();
}

Starting

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

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);

Stopping

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 final `ℹ` frame and blue color.
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 to handle interupts.

The most basic way to handle it would be in conjuction with this lib QoL show_cursor function like this:

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();
    // ...

Inspired by:

No runtime deps