2 个版本

0.1.1 2022 年 8 月 26 日
0.1.0 2022 年 8 月 26 日

#133可视化

MIT 许可证

170KB
4.5K SLoC

包 simple_dot

创建 GraphViz DOT 文件的简单 API。

MIT License Minimum Rust Version crates.io docs.rs Build Audit GitHub stars

待定

此包的目的是提供一个易于使用的构建器风格接口,以便轻松创建 DOT 文件。这牺牲了性能,并且与类似 dot 的包相比,内存使用量更高。

示例

use crate::writer::write_graph;
use crate::graph::{Cluster, Graph, RootGraph};
use crate::node::Node;
use crate::style::{
    ClusterAttributes, ClusterStyles, Color, EdgeAttributes, FontName, GraphAttributes,
    LabelString, NodeAttributes, NodeStyles, Shape, Styled,
};
use crate::writer::Indenter;
use crate::Identifier;
use std::str::FromStr;

let fonts = FontName::list(vec![
    FontName::family("Helvetica").unwrap(),
    FontName::family("Arial").unwrap(),
    FontName::family("sans-serif").unwrap(),
]);
let root = RootGraph::new(Identifier::from_str("G").unwrap(), false, true)
    .set_attributes(GraphAttributes::default().font_name(fonts.clone()))
    .set_default_node_attributes(NodeAttributes::default().font_name(fonts.clone()))
    .set_default_edge_attributes(EdgeAttributes::default().font_name(fonts.clone()))
    .add_sub_graph(
        Cluster::new(0i64.into())
            .set_attributes(
                ClusterAttributes::default()
                    .label(LabelString::from_str("process #1").unwrap())
                    .color(Color::named("lightgrey").unwrap().into())
                    .style(vec![ClusterStyles::Filled]),
            )
            .set_default_node_attributes(
                NodeAttributes::default()
                    .color(Color::named("white").unwrap().into())
                    .style(vec![NodeStyles::Filled]),
            )
            .chain(vec![
                Node::new(Identifier::from_str("a0").unwrap()),
                Node::new(Identifier::from_str("a1").unwrap()),
                Node::new(Identifier::from_str("a2").unwrap()),
                Node::new(Identifier::from_str("a3").unwrap()),
            ]),
    )
    .add_sub_graph(
        Cluster::new(1i64.into())
            .set_attributes(
                ClusterAttributes::default()
                    .label(LabelString::from_str("process #2").unwrap())
                    .color(Color::named("blue").unwrap().into()),
            )
            .set_default_node_attributes(
                NodeAttributes::default().style(vec![NodeStyles::Filled]),
            )
            .chain(vec![
                Node::new(Identifier::from_str("b0").unwrap()),
                Node::new(Identifier::from_str("b1").unwrap()),
                Node::new(Identifier::from_str("b2").unwrap()),
                Node::new(Identifier::from_str("b3").unwrap()),
            ]),
    )
    .add_node(
        Node::new(Identifier::from_str("start").unwrap())
            .set_attributes(NodeAttributes::default().shape(Shape::m_diamond())),
    )
    .add_node(
        Node::new(Identifier::from_str("end").unwrap())
            .set_attributes(NodeAttributes::default().shape(Shape::m_square())),
    )
    .add_edge_between(
        Identifier::from_str("start").unwrap(),
        Identifier::from_str("a0").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("start").unwrap(),
        Identifier::from_str("b0").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("a1").unwrap(),
        Identifier::from_str("b3").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("b2").unwrap(),
        Identifier::from_str("a3").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("a3").unwrap(),
        Identifier::from_str("a0").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("a3").unwrap(),
        Identifier::from_str("end").unwrap(),
    )
    .add_edge_between(
        Identifier::from_str("b3").unwrap(),
        Identifier::from_str("end").unwrap(),
    );

write_graph(&root, &mut std::io::stdout()).unwrap();
digraph G {
  fontname = "Helvetica,Arial,sans-serif";

  node [
    fontname = "Helvetica,Arial,sans-serif";
  ];

  edge [
    fontname = "Helvetica,Arial,sans-serif";
  ];

  subgraph cluster_0 {
    label = "process #1";
    color = lightgrey;
    style = filled;

    node [
      color = white;
      style = filled;
    ];

    a0 -> a1;
    a1 -> a2;
    a2 -> a3;
  }
  subgraph cluster_1 {
    label = "process #2";
    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;
}

变更记录

版本 0.1.1

  • 重写了自动 ID 生成,以创建 Cluster、Graph、节点和边 ID。

版本 0.1.0

  • 初始版本。

依赖项