# Parallel Status Lines
**parsli** is an opiniated 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.
```rust
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.
```rust
use std::thread::sleep;
use std::time::Duration;
use parsli::{Task, Line, Ctx};
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.
```rust
pool.add_task("mytask", vec![], mytask);
```
When all tasks have been added to the pool, it can be started with `ThreadPool::start`.
```rust
pool.start();
```
## Full example
```rust
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();
}
```