# quercus
*quercus* is the scientific genus name for oak trees.
This crate was inspired by [ptree](https://crates.io/crates/ptree).
## Main features
This crate allows you to create trees with many roots.
---
This crate does not have a syntax distinction for the first node/branch of a given root.
The crate also does not have a syntax distinction for nodes that do not have branches (leaves) or nodes that do.
This makes it easy to create a tree recursively, as the information is not needed when adding a new node.
---
This crate also provides a (small) variety of branch styles and a versatile indentation option that may be invoked spontaneously during the construction of the tree.
## Usage
The following code
```rust
let mut tree = Tree::new();
tree.node("Root");
tree.begin_branches();
tree.node("Branch 1");
tree.node("Branch 2");
tree.end_branches();
tree.prune();
println!("{tree}");
```
results in:
```bash
Root
├── Branch 1
└── Branch 2
```
For a node with many lines use the `node_many_lines()` command.
For example, the code
```rust
let mut tree = Tree::new().style(PipeStyle::Double).indent(5);
tree.node("Root");
tree.begin_branches();
tree.node_many_lines(&["Branch 1", "Some", "more", "information"]);
tree.begin_branches();
tree.node("Autumn leaf");
tree.node("Spring leaf");
tree.end_branches();
tree.indent(0); // Change indentation
tree.node("Branch 2");
tree.begin_branches();
tree.node("Summer leaf");
tree.node("Winter (no leaf) :(");
tree.end_branches();
tree.end_branches();
tree.prune_and_print();
```
results in:
```bash
Root
╠═════ Branch 1
║ Some
║ more
║ information
║ ╠═════ Autumn leaf
║ ╚═════ Spring leaf
╚ Branch 2
╠ Summer leaf
╚ Winter (no leaf) :(
```
## Appearance Options
### Indentation
The indentation of the branches can be set through the `indent()` command, which expects a `usize` integer.
This command can be invoked anywhere during the construction of the tree.
### Branch Style
The style of the branches can be set through the `style()` command, which expects a `PipeStyle` `enum` variant.
Currently, the following variants are available:
* `PipeStyle::Simple` : `│` `─` `├` `└`
* `PipeStyle::Curvy` : `│` `─` `├` `╰`
* `PipeStyle::Double` : `║` `═` `╠` `╚`
* `PipeStyle::Thick` : `┃` `━` `┣` `┗`
This command, however, may only be invoked at the root level of the tree.
## Crate Examples
For an example that builds a tree recursively, run
```bash
$ cargo run --release --example fibonacci
```
This should yield the following output:
```bash
5
├─ 3
│ ├─ 2
│ │ ├─ 1
│ │ │ ├─ 1
│ │ │ ╰─ 0
│ │ ╰─ 1
│ ╰─ 1
│ ├─ 1
│ ╰─ 0
╰─ 2
├─ 1
│ ├─ 1
│ ╰─ 0
╰─ 1
```
---
For an example that uses the [colored](https://crates.io/crates/colored) crate as well as the `node_many_lines()` command, run
```bash
$ cargo run --release --example hierarchy
```
## License
This project is licensed under either
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
* MIT License ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)