Split graph population function into three
This commit is contained in:
parent
f1965f7530
commit
8938f98199
1 changed files with 65 additions and 48 deletions
135
src/formats.rs
135
src/formats.rs
|
|
@ -2,6 +2,82 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
|
pub fn populate_graph() -> Graph {
|
||||||
|
|
||||||
|
let toml_source = match std::fs::read_to_string("./static/graph.toml") {
|
||||||
|
Ok(s) => s,
|
||||||
|
Err(e) => format!("Error: {e}"),
|
||||||
|
};
|
||||||
|
let graph = deserialize_graph(Format::Toml, &toml_source);
|
||||||
|
|
||||||
|
let nodes = modulate_nodes(graph.nodes.clone());
|
||||||
|
|
||||||
|
Graph {
|
||||||
|
nodes: nodes.clone(),
|
||||||
|
incoming: make_incoming(nodes.clone()),
|
||||||
|
..graph
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn modulate_nodes(old_nodes: HashMap<String, Node>) -> HashMap<String, Node> {
|
||||||
|
|
||||||
|
let mut nodes: HashMap<String, Node> = HashMap::new();
|
||||||
|
|
||||||
|
for (key, node) in old_nodes.iter() {
|
||||||
|
|
||||||
|
let connections = node.connections.clone().unwrap_or_default();
|
||||||
|
let mut vec = connections.clone();
|
||||||
|
|
||||||
|
for (i, edge) in connections.iter().enumerate() {
|
||||||
|
|
||||||
|
let mut new_edge = edge.clone();
|
||||||
|
|
||||||
|
// Populate empty "from" IDs in edges with node's ID
|
||||||
|
if edge.from == "" {
|
||||||
|
new_edge.from = key.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flag detached edges
|
||||||
|
if ! old_nodes.contains_key(&edge.to) {
|
||||||
|
new_edge.detached = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec[i] = new_edge;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let new_node = Node {
|
||||||
|
connections: Some(vec),
|
||||||
|
..node.clone()
|
||||||
|
};
|
||||||
|
nodes.insert(key.to_string(), new_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
nodes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct a HashMap with incoming connections (reversed edges)
|
||||||
|
fn make_incoming(nodes: HashMap<String, Node>) -> HashMap<String, Vec<Edge>> {
|
||||||
|
|
||||||
|
let mut incoming: HashMap<String, Vec<Edge>> = HashMap::new();
|
||||||
|
for node in nodes.clone().into_values() {
|
||||||
|
|
||||||
|
let empty_vec: Vec<Edge> = vec![];
|
||||||
|
for edge in node.connections.clone().unwrap_or_default().iter() {
|
||||||
|
|
||||||
|
let vec = incoming.get(&edge.to.clone()).unwrap_or(&empty_vec);
|
||||||
|
if vec.contains(edge) {
|
||||||
|
vec.clone().extend_from_slice(&[edge.clone()]);
|
||||||
|
incoming.insert(edge.to.clone(), vec.clone());
|
||||||
|
} else {
|
||||||
|
incoming.insert(edge.to.clone(), vec![edge.clone()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
incoming
|
||||||
|
}
|
||||||
|
|
||||||
pub enum Format {
|
pub enum Format {
|
||||||
Toml,
|
Toml,
|
||||||
Json
|
Json
|
||||||
|
|
@ -39,63 +115,4 @@ pub fn deserialize_graph(in_format: Format, serial: &String) -> Graph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn populate_graph() -> Graph {
|
|
||||||
let toml_source = match std::fs::read_to_string("./static/graph.toml") {
|
|
||||||
Ok(s) => s,
|
|
||||||
Err(e) => format!("Error: {e}"),
|
|
||||||
};
|
|
||||||
let graph = deserialize_graph(Format::Toml, &toml_source);
|
|
||||||
let mut new_nodes: HashMap<String, Node> = HashMap::new();
|
|
||||||
let mut incoming: HashMap<String, Vec<Edge>> = HashMap::new();
|
|
||||||
|
|
||||||
for (key, node) in graph.nodes.iter() {
|
|
||||||
|
|
||||||
let connections = node.connections.clone().unwrap_or_default();
|
|
||||||
let mut vec = connections.clone();
|
|
||||||
|
|
||||||
for (i, edge) in connections.iter().enumerate() {
|
|
||||||
|
|
||||||
let mut new_edge = edge.clone();
|
|
||||||
|
|
||||||
if edge.from == "" {
|
|
||||||
new_edge.from = key.to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! graph.nodes.contains_key(&edge.to) {
|
|
||||||
new_edge.detached = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec[i] = new_edge;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
let new_node = Node {
|
|
||||||
connections: Some(vec),
|
|
||||||
..node.clone()
|
|
||||||
};
|
|
||||||
new_nodes.insert(key.to_string(), new_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Construct a HashMap with incoming connections (reversed edges)
|
|
||||||
for node in new_nodes.clone().into_values() {
|
|
||||||
|
|
||||||
let empty_vec: Vec<Edge> = vec![];
|
|
||||||
for edge in node.connections.clone().unwrap_or_default().iter() {
|
|
||||||
|
|
||||||
let vec = incoming.get(&edge.to.clone()).unwrap_or(&empty_vec);
|
|
||||||
if vec.contains(edge) {
|
|
||||||
vec.clone().extend_from_slice(&[edge.clone()]);
|
|
||||||
incoming.insert(edge.to.clone(), vec.clone());
|
|
||||||
} else {
|
|
||||||
incoming.insert(edge.to.clone(), vec![edge.clone()]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Graph {
|
|
||||||
nodes: new_nodes,
|
|
||||||
incoming: incoming,
|
|
||||||
..graph
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue