dagre_rust 0.0.5

Dagre implementation in Rust
Documentation
pub mod bk;

use graphlib_rust::Graph;
use crate::{GraphConfig, GraphEdge, GraphNode};
use crate::layout::position::bk::position_x;
use crate::layout::util;

pub fn position(g: &mut Graph<GraphConfig, GraphNode, GraphEdge>) {
  let mut ncg: Graph<GraphConfig, GraphNode, GraphEdge> = util::as_non_compound_graph(g);

  position_y(&mut ncg);
  position_x(&mut ncg).iter().for_each(|(v, x)| {
    g.node_mut(v).unwrap().x = x.clone();
    g.node_mut(v).unwrap().y = ncg.node(v).unwrap().y;
  });
}

fn position_y(g: &mut Graph<GraphConfig, GraphNode, GraphEdge>) {
  let layering = util::build_layer_matrix(g);
  let rank_sep = g.graph().ranksep.clone().unwrap();
  let mut prev_y = 0.0;
  layering.iter().for_each(|layer| {
    let max_height: f32 = layer.iter().map(|v| {
      g.node(v).unwrap().height as i32
    }).max().unwrap_or(0) as f32;

    layer.iter().for_each(|v| {
      let node = g.node_mut(v).unwrap();
      node.y = prev_y + max_height / 2.0;
    });

    prev_y += max_height + rank_sep;
  });
}