5 releases

0.1.4 Feb 28, 2021
0.1.3 Feb 28, 2021
0.1.2 Feb 26, 2021
0.1.1 Feb 26, 2021
0.1.0 Feb 25, 2021

#5 in #done

27 downloads per month
Used in 3 crates

MIT license

21KB
191 lines

Throbber

Crates.io docs.rs GitHub last commit License

This crate serves as an alternative to loading. It is used to display a throbber animation in the terminal while other calculations are done in the main program.

Throbber Preview

Usage

Add this to your Cargo.toml:

[dependencies]
throbber = "0.1"

To display a throbber animation, first create a Throbber object:

let mut throbber = Throbber::new();

You can also customize certain settings like the displayed animation and the displayed message:

let mut throbber = Throbber::new()
    .message("calculating stuff".to_string())
    .frames(&throbber::MOVE_EQ_F); // this crate comes with a few predefined animations
                                   // see the Constants section

Then you can simply call start wherever you want to start the animation and a finish function like success where you want to stop it.

throbber.start();
// do calculations
throbber.success("calculations successful!".to_string());

After which you can call start or start_with_msg again to start the animation again. You can also change everything you could customize during the Throbber object creation, e. g. with change_message and change_frames. This also works while an animation is running.

If you don't intend to start another animation, you should drop the Throbber object with end. This action also ends the underlying thread:

throbber.end();

Examples

This is the example from the preview above and can be run with cargo run --example calculation:

use std::thread;
use std::time::Duration;
use throbber::Throbber;

fn main() {
    let mut throbber = Throbber::new().message("calculating stuff".to_string());

    throbber.start();
    // do stuff
    thread::sleep(Duration::from_secs(2));
    throbber.success("Success".to_string());

    throbber.start_with_msg("calculating more stuff".to_string());
    // do other stuff
    thread::sleep(Duration::from_secs(2));
    throbber.fail("Fail".to_string());

    throbber.end();
}

You can also keep track of progress with change_message. This can be run with cargo run --example download:

use std::thread;
use std::time::Duration;
use throbber::Throbber;

fn main() {
    let mut throbber = Throbber::new()
        .message("Downloading file1 0%".to_string())
        .frames(&throbber::ROTATE_F)
        .interval(Duration::from_millis(100));

    throbber.start();
    for i in 0..100 {
        throbber.change_message(format!("Downloading file1 {}%", i));
        thread::sleep(Duration::from_millis(30));
    }
    throbber.success("Downloaded file1".to_string());

    throbber.start_with_msg("Downloading file2 0%".to_string());
    for i in 0..69 {
        throbber.change_message(format!("Downloading file2 {}%", i));
        thread::sleep(Duration::from_millis(30));
    }
    throbber.fail("Download of file2 failed".to_string());

    throbber.end();
}

No runtime deps