willdo 0.0.1

Task manager with DAG
Documentation
# manage jobs

The `Graph` holds your jobs and their relationships and their state.

You can build it manually:

```rust
# (|| {
use crate::willdo::config::Configuration as _;
let mut builder = willdo::graph::Graph::builder();
builder.configure_job(
    &[],
    "job name".into(),
    "source".into(),
    vec!["script".into()],
    Some("interpretter".into()),
    vec![/*relations to other jobs*/]
)?;
let grap = builder.build()?;
# Ok::<(),willdo::graph::BuildError>(()) })().expect("build");
```

Or you can build from configuration - see `config` module.

Once it is built, you can examine the contents:

```rust
# (|| {
# let mut graph = willdo::graph::Graph::builder().build().expect("build");
for (indent, id, info) in graph.tree(&[])
{
    print!("{}", "  ".repeat(indent));
    println!("{id} ({info})");
}
# Ok::<(),willdo::graph::BuildError>(()) })().expect("build");
```

Or execute jobs manually:

```rust
# (|| {
# let mut graph = willdo::graph::Graph::builder().build().expect("build");
use willdo::execution::repository::JobRepository as _;
use willdo::execution::progress::Progress;
for execution in graph.execute(&[])
{
    execution.progress().update(Progress::Start);
}
# Ok::<(),willdo::graph::BuildError>(()) })().expect("build");
```

But most likely, you'll prefer a runner to do this for you - see `execution` module.