Skip to main content

loader/
loader.rs

1//! A tour of Inkling as a loader.
2//!
3//!   cargo run --example loader            # determinate dragon loader
4//!   cargo run --example loader -- iter    # wrap an iterator
5//!   cargo run --example loader -- spinner # indeterminate spinner
6//!   cargo run --example loader -- threads # progress from worker threads
7//!   cargo run --example loader -- rainbow # lolcat-style rainbow palette
8//!
9//! On a real terminal the dragon paints itself as the work runs. Piped or in CI it
10//! prints the finished art once instead.
11
12use std::thread;
13use std::time::Duration;
14
15use inkling::{Loader, ProgressIteratorExt};
16
17fn work(ms: u64) {
18    thread::sleep(Duration::from_millis(ms));
19}
20
21fn main() {
22    match std::env::args().nth(1).as_deref() {
23        Some("iter") => {
24            for _ in (0..100).inkling() {
25                work(20);
26            }
27        }
28        Some("spinner") => {
29            let loader = Loader::spinner();
30            loader.set_message("Doing something mysterious");
31            work(2500);
32            loader.finish();
33        }
34        Some("threads") => {
35            let loader = Loader::new(120);
36            loader.set_message("Four workers, one dragon");
37            thread::scope(|s| {
38                for _ in 0..4 {
39                    let handle = loader.handle();
40                    s.spawn(move || {
41                        for _ in 0..30 {
42                            work(30);
43                            handle.inc(1);
44                        }
45                    });
46                }
47            });
48            loader.finish();
49        }
50        Some("rainbow") => {
51            let loader = Loader::builder()
52                .total(100)
53                .style(inkling::render::Style::rainbow())
54                .message("Tasting the rainbow")
55                .start();
56            for _ in 0..100 {
57                work(20);
58                loader.inc(1);
59            }
60            loader.finish();
61        }
62        _ => {
63            let total: u64 = 100;
64            let loader = Loader::new(total);
65            loader.set_message("Summoning the dragon");
66            for _ in 0..total {
67                work(20);
68                loader.inc(1);
69            }
70            loader.finish();
71        }
72    }
73}