use std::hash::Hash;
use petgraph::visit::{
EdgeIndexable, IntoEdgeReferences, IntoNeighborsDirected, IntoNodeReferences, NodeIndexable,
};
use crate::{
errors::VisGraphError, graph_to_svg::graph_to_svg_string, settings::Settings,
svg_to_img::svg_to_img,
};
#[allow(clippy::needless_doctest_main)]
#[doc = include_str!("../examples/default_settings.rs")]
#[cfg(feature = "img")]
pub fn graph_to_img<G, PositionMapFn, NodeLabelFn, EdgeLabelFn, NodeColoringFn, EdgeColoringFn>(
graph: G,
settings: &Settings<PositionMapFn, NodeLabelFn, EdgeLabelFn, NodeColoringFn, EdgeColoringFn>,
path: impl AsRef<std::path::Path>,
) -> Result<(), VisGraphError>
where
G: IntoNodeReferences
+ IntoEdgeReferences
+ NodeIndexable
+ EdgeIndexable
+ IntoNeighborsDirected,
G::NodeId: Hash + Eq,
PositionMapFn: Fn(G::NodeId) -> (f32, f32),
NodeLabelFn: Fn(G::NodeId) -> String,
EdgeLabelFn: Fn(G::EdgeId) -> String,
NodeColoringFn: Fn(G::NodeId) -> String,
EdgeColoringFn: Fn(G::EdgeId) -> String,
{
let svg_data = graph_to_svg_string(graph, settings);
svg_to_img(&svg_data, settings.width, settings.height, path)?;
Ok(())
}