parsli

Crates.ioparsli
lib.rsparsli
version0.1.4
sourcesrc
created_at2022-06-20 15:16:55.994105
updated_at2023-08-18 09:32:14.031054
descriptionParallel status lines for Rust
homepagehttps://gitlab.com/maximdeclercq/parsli-rs
repositoryhttps://gitlab.com/maximdeclercq/parsli-rs
max_upload_size
id609587
size32,602
Maxim De Clercq (maximdeclercq)

documentation

README

Parallel Status Lines

crates.io rustc

parsli is an opinionated Rust library to visualize the execution of dependent tasks. It is designed to be as flexible as possible, while abstracting away the management of dependencies and command-line visualization.

Quickstart

Everything is managed through the ThreadPool struct, which takes care of dependencies and status lines.

use parsli::ThreadPool;

// Execute 4 tasks in parallel
let mut pool = ThreadPool::new(4);

A task has a name, dependencies and some function it has to execute. This function takes three arguments

  • line: The status line of this thread that can be controlled.
  • name: The name of this task.
  • ctx: A hashmap with results of the tasks this one depends oni. This is a basic example on how to instantiate a task.
use std::thread::sleep;
use std::time::Duration;
use parsli::{Task, Line, Ctx};

let mytask = Task::new(|line: Line, name: String, ctx: Ctx<String>| {
    line.update_message("preparing...".to_string());
    sleep(Duration::from_millis(1000));
    line.update_message("processing...".to_string());
    sleep(Duration::from_millis(2000));
    Ok("this is the result".to_string())
});

Tasks can be added to the pool with the ThreadPool::add_task function.

pool.add_task("mytask", vec![], mytask);

When all tasks have been added to the pool, it can be started with ThreadPool::start.

pool.start();

Full example

use std::thread::sleep;
use std::time::Duration;
use parsli::{Ctx, Line, ThreadPool, Task};

/// This is a minimal example on how to use parsli
fn main() {
    let mut pool = ThreadPool::new(4);
    let dummy = Task::new(|line: Line, name: String, ctx: Ctx<String>| {
        line.update_message("preparing...".to_string());
        sleep(Duration::from_millis(1000 + 10 * (rand::random::<u8>() as u64)));
        if name != "clang.install".to_string() {
            Ok("this is the result".to_string())
        } else {
            Err("this task went terribly wrong".to_string())
        }
    });
    pool.add_task("llvm.fetch", vec![], dummy.clone());
    pool.add_task("clang.configure", vec!["llvm.fetch"], dummy.clone());
    pool.add_task("compiler-rt.configure", vec!["llvm.fetch"], dummy.clone());
    pool.add_task("clang.compile", vec!["clang.configure"], dummy.clone());
    pool.add_task("compiler-rt.compile", vec!["compiler-rt.configure"], dummy.clone());
    pool.add_task("clang.install", vec!["clang.compile"], dummy.clone());
    pool.add_task("compiler-rt.install", vec!["compiler-rt.compile"], dummy.clone());
    pool.start();
}

animation

Commit count: 25

cargo fmt