# dot_graph
A library for generating Graphviz DOT language files.
The code is forked from [dot-rust](https://github.com/przygienda/dot-rust) with new API for easier to use.
[](https://opensource.org/licenses/Apache-2.0)
[](https://opensource.org/licenses/MIT)
## Usage
The very basic three parts of a DOT file and in this library is `Graph`,
`Node` and `Edge`. `Graph` is the entry point of the library. You could
generate an empty graph .dot file by simply use:
```rust
use dot_graph::{Graph, Kind};
let graph = Graph::new("empty_graph", Kind::Digraph);
let dot_string = graph.to_dot_string().unwrap();
assert_eq!(dot_string,
r#"digraph empty_graph {
}
//!"#);
```
In order to add some basic nodes and edges:
```rust
use dot_graph::{Graph, Kind, Node, Edge};
let mut graph = Graph::new("single_edge", Kind::Digraph);
graph.add_node(Node::new("N0"));
graph.add_node(Node::new("N1"));
graph.add_edge(Edge::new("N0", "N1", "E"));
let dot_string = graph.to_dot_string().unwrap();
assert_eq!(dot_string,
r#"digraph single_edge {
N0[label="N0"];
N1[label="N1"];
N0 -> N1[label="E"];
}
"#);
```
If you want add some more attributes, like style, arrow, color,
you could call these methods in a chain, like:
```rust
use dot_graph::{Graph, Kind, Node, Edge, Style};
let mut graph = Graph::new("single_edge", Kind::Digraph);
graph.add_node(Node::new("N0"));
graph.add_node(Node::new("N1"));
graph.add_edge(Edge::new("N0", "N1", "E").style(Style::Bold).color(Some("red")));
assert_eq!(graph.to_dot_string().unwrap(),
r#"digraph single_edge {
N0[label="N0"];
N1[label="N1"];
N0 -> N1[label="E"][style="bold"][color="red"];
}
"#);
```
After version 0.2.1, dot_graph support subgraph generation, for example:
```rust
#[test]
fn test_subgraph() {
let mut graph = Graph::new("di", Kind::Digraph);
let mut c1 = Subgraph::new("cluster_0").label("");
c1.add_node(Node::new("N0"));
c1.add_node(Node::new("N1"));
let mut c2 = Subgraph::new("cluster_1").label("");
c2.add_node(Node::new("N2"));
c2.add_node(Node::new("N3"));
graph.add_subgraph(c1);
graph.add_subgraph(c2);
graph.add_edge(Edge::new("N0", "N1", ""));
graph.add_edge(Edge::new("N0", "N2", ""));
graph.add_edge(Edge::new("N1", "N3", ""));
graph.add_edge(Edge::new("N2", "N3", ""));
assert_eq!(graph.to_dot_string().unwrap(),
r#"digraph di {
subgraph cluster_0 {
label="";
N0[label="N0"];
N1[label="N1"];
}
subgraph cluster_1 {
label="";
N2[label="N2"];
N3[label="N3"];
}
N0 -> N1[label=""];
N0 -> N2[label=""];
N1 -> N3[label=""];
N2 -> N3[label=""];
}
"#);
}
```
For more examples, please check the tests.
The library is under active development, we'll include more dot attributes
in the future.
## Roadmap (TODO list)
- support for subgraph
## Contributing
- All sorts of contributing are welcome. create issue and/or PR as you please.
- We belive that TDD(Test-Driven Development) approach is helpful not only in development, but also in communication with each other. So adding more tests might be a good way to report a bug or even suggest a new feature.
## License
dot_graph is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT for details.
## Related Project
[rudg](https://github.com/SelamaAshalanore/rudg): Rust UML Diagram Generator. A library for generating UML diagram from Rust source code.