9 releases

0.1.5 Oct 5, 2025
0.1.4 Sep 23, 2023
0.1.3 May 24, 2023
0.1.2 Jul 30, 2022
0.0.2 Mar 7, 2022

#295 in Command-line interface

Download history 891/week @ 2025-10-09 621/week @ 2025-10-16 928/week @ 2025-10-23 702/week @ 2025-10-30 607/week @ 2025-11-06 544/week @ 2025-11-13 684/week @ 2025-11-20 1060/week @ 2025-11-27 1398/week @ 2025-12-04 1198/week @ 2025-12-11 972/week @ 2025-12-18 800/week @ 2025-12-25 1192/week @ 2026-01-01 1169/week @ 2026-01-08 1409/week @ 2026-01-15 1212/week @ 2026-01-22

5,070 downloads per month
Used in 3 crates (2 directly)

MIT license

64KB
909 lines

nutmeg - an unopinionated progress bar library

https://github.com/sourcefrog/cargo-mutants

Tests docs.rs crates.io libs.rs Maturity: Beta

Nutmeg draws terminal progress indicators while giving the application complete control over their appearance and content.

For more information: https://docs.rs/nutmeg

License: MIT

Example

From examples/basic.rs:

use std::io::Write; // to support write!()

// 1. Define a struct holding all the application state necessary to
// render the progress bar.
#[derive(Default)]
struct Model {
    i: usize,
    total: usize,
    last_file_name: String,
}

// 2. Define how to render the progress bar as a String.
impl nutmeg::Model for Model {
    fn render(&mut self, _width: usize) -> String {
        format!("{}/{}: {}", self.i, self.total, self.last_file_name)
    }
}

fn main() -> std::io::Result<()> {
    // 3. Create a View when you want to draw a progress bar.
    let mut view = nutmeg::View::new(Model::default(),
        nutmeg::Options::default());

    // 4. As the application runs, update the model via the view.
    let total_work = 100;
    view.update(|model| model.total = total_work);
    for i in 0..total_work {
        view.update(|model| {
            model.i += 1;
            model.last_file_name = format!("file{}.txt", i);
        });
        // 5. Interleave text output lines by writing to the view.
        if i % 10 == 3 {
            writeln!(view, "reached {}", i)?;
        }
        std::thread::sleep(std::time::Duration::from_millis(100));
    }

    // 5. The bar is automatically erased when dropped.
    Ok(())
}

asciicast

Dependencies

~2–15MB
~174K SLoC