Skip to content

SelamaAshalanore/dot_graph

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

74 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dot_graph

A library for generating Graphviz DOT language files. The code is forked from dot-rust with new API for easier to use.

License License: 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:

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:

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:

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:

#[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: Rust UML Diagram Generator. A library for generating UML diagram from Rust source code.