# 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.