Crate dotavious[][src]

Dotavious provides bindings to generate DOT code used by the Graphviz (http://graphviz.org/) for visualising graphs. It also provides strongly typed attribute functions and offers almost complete coverage of all Graphviz attributes and syntax.

Examples

First example provides a basic directed graph: 2 nodes connected by a single edge

use dotavious::{Dot, Edge, Graph, GraphBuilder, Node};

let g = GraphBuilder::new_directed(Some("example".to_string()))
        .add_node(Node::new("N0".to_string()))
        .add_node(Node::new("N1".to_string()))
        .add_edge(Edge::new("N0".to_string(), "N1".to_string()))
        .build()
        .unwrap();

let dot = Dot { graph: g };
println!("{}", dot);

Produces

digraph example {
    N0;
    N1;
    N0 -> N1;
}

We can also output to a Writer via the render function

use dotavious::{Dot, Edge, Graph, GraphBuilder, Node};
use std::io;
use std::io::Read;

let g = GraphBuilder::new_directed(Some("example".to_string()))
        .add_node(Node::new("N0".to_string()))
        .add_node(Node::new("N1".to_string()))
        .add_edge(Edge::new("N0".to_string(), "N1".to_string()))
        .build()
        .unwrap();

let dot = Dot { graph: g };
let mut writer= Vec::new();
dot.render(&mut writer).unwrap();

// output to graphviz DOT formatted string
let mut dot_string = String::new();
Read::read_to_string(&mut &*writer, &mut dot_string).unwrap();
println!("{}", dot_string);

Second example provides a more complex graph showcasing Dotavious’ various builders and strongly typed attribute functions.

use dotavious::attributes::{
    AttributeText, Color, CompassPoint, EdgeAttributes, EdgeStyle,
    GraphAttributeStatementBuilder, GraphAttributes, GraphStyle, NodeAttributes,
    NodeStyle, PortPosition, RankDir, Shape,
};
use dotavious::{
    Dot, Edge, EdgeAttributeStatementBuilder, EdgeBuilder, Graph,
    GraphBuilder, Node, NodeAttributeStatementBuilder, NodeBuilder,
    SubGraphBuilder
};
use std::io;
use std::io::Read;

let cluster_0 = SubGraphBuilder::new(Some("cluster_0".to_string()))
    .add_graph_attributes(
        GraphAttributeStatementBuilder::new()
            .label("process #1".to_string())
            .style(GraphStyle::Filled)
            .color(Color::Named("lightgrey"))
            .build()
            .unwrap(),
    )
    .add_node_attributes(
        NodeAttributeStatementBuilder::new()
            .style(NodeStyle::Filled)
            .color(Color::Named("white"))
            .build()
            .unwrap(),
    )
    .add_edge(Edge::new("a0".to_string(), "a1".to_string()))
    .add_edge(Edge::new("a1".to_string(), "a2".to_string()))
    .add_edge(Edge::new("a2".to_string(), "a3".to_string()))
    .build()
    .unwrap();

let cluster_1 = SubGraphBuilder::new(Some("cluster_1".to_string()))
    .add_graph_attributes(
        GraphAttributeStatementBuilder::new()
            .label("process #2".to_string())
            .style(GraphStyle::Filled)
            .color(Color::Named("blue"))
            .build()
            .unwrap(),
    )
    .add_node_attributes(
        NodeAttributeStatementBuilder::new()
            .style(NodeStyle::Filled)
            .build()
            .unwrap(),
    )
    .add_edge(Edge::new("b0".to_string(), "b1".to_string()))
    .add_edge(Edge::new("b1".to_string(), "b2".to_string()))
    .add_edge(Edge::new("b2".to_string(), "b3".to_string()))
    .build()
    .unwrap();

let g = GraphBuilder::new_directed(Some("G".to_string()))
    .add_node(
        NodeBuilder::new("start".to_string())
            .shape(Shape::Mdiamond)
            .build()
            .unwrap(),
    )
    .add_node(
        NodeBuilder::new("end".to_string())
            .shape(Shape::Msquare)
            .build()
            .unwrap(),
    )
    .add_sub_graph(cluster_0)
    .add_sub_graph(cluster_1)
    .add_edge(Edge::new("start".to_string(), "a0".to_string()))
    .add_edge(Edge::new("start".to_string(), "b0".to_string()))
    .add_edge(Edge::new("a1".to_string(), "b3".to_string()))
    .add_edge(Edge::new("b2".to_string(), "a3".to_string()))
    .add_edge(Edge::new("a3".to_string(), "a0".to_string()))
    .add_edge(Edge::new("a3".to_string(), "end".to_string()))
    .add_edge(Edge::new("b3".to_string(), "end".to_string()))
    .build();

Produces

digraph G {
    subgraph cluster_0 {
        graph [label="process #1", style=filled, color="lightgrey"];
        node [style=filled, color="white"];
        a0 -> a1;
        a1 -> a2;
        a2 -> a3;
    }

    subgraph cluster_1 {
        graph [label="process #2", style=filled, color="blue"];
        node [style=filled];
        b0 -> b1;
        b1 -> b2;
        b2 -> b3;
    }

    start [shape=Mdiamond];
    end [shape=Msquare];
    start -> a0;
    start -> b0;
    a1 -> b3;
    b2 -> a3;
    a3 -> a0;
    a3 -> end;
    b3 -> end;
}

Modules

attributes
dot
validation