use crate::Zettel;
use petgraph::dot::{Config, Dot};
use petgraph::graph::NodeIndex;
use petgraph::Graph;
pub fn zk_graph_dot_output(zs: &[Zettel])
{
dot_output(gen_graph(zs));
}
fn gen_graph(zs: &[Zettel]) -> Graph<&str, &str>
{
let mut graph = Graph::<&str, &str>::new();
let mut idxs = vec![];
for z in zs {
let (_, seen_idx) = find_seen_by_name(idxs.clone(), &z.title);
let t_idx = if seen_idx == NodeIndex::default() {
let idx = graph.add_node(&z.title);
idxs.push((&z.title, idx));
idx
} else {
seen_idx
};
for l in &z.links {
let (_, seen_idx) = find_seen_by_name(idxs.clone(), l);
let l_idx = if seen_idx == NodeIndex::default() {
let idx = graph.add_node(l);
idxs.push((l, idx));
idx
} else {
seen_idx
};
graph.add_edge(t_idx, l_idx, "");
}
}
graph
}
fn find_seen_by_name(seen: Vec<(&str, NodeIndex)>, name: &str) -> (String, NodeIndex)
{
let (n, i) = seen.into_iter()
.find(|(v, _)| v == &name)
.unwrap_or_default();
(n.to_string(), i)
}
fn dot_output(g: Graph<&str, &str>)
{
println!("{}", Dot::with_config(&g, &[Config::EdgeNoLabel]));
}