pub trait Inspectable {
fn layer_info(&self) -> LayerInfo;
fn dependencies(&self) -> Vec<crate::graph::node_id::NodeId>;
fn dependents(&self) -> Vec<crate::graph::node_id::NodeId>;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LayerInfo {
pub layer: crate::graph::layer::Layer,
pub role: crate::graph::role::Role,
pub type_name: String,
}
impl Inspectable for crate::graph::hex_node::HexNode {
fn layer_info(&self) -> LayerInfo {
LayerInfo {
layer: self.layer(),
role: self.role(),
type_name: String::from(self.type_name()),
}
}
fn dependencies(&self) -> Vec<crate::graph::node_id::NodeId> {
Vec::new()
}
fn dependents(&self) -> Vec<crate::graph::node_id::NodeId> {
Vec::new()
}
}
impl Inspectable for crate::graph::hex_graph::HexGraph {
fn layer_info(&self) -> LayerInfo {
LayerInfo {
layer: crate::graph::layer::Layer::Unknown,
role: crate::graph::role::Role::Unknown,
type_name: String::from("HexGraph"),
}
}
fn dependencies(&self) -> Vec<crate::graph::node_id::NodeId> {
Vec::new()
}
fn dependents(&self) -> Vec<crate::graph::node_id::NodeId> {
Vec::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Debug, Clone, PartialEq)]
pub struct LayerInfo {
pub layer: crate::graph::layer::Layer,
pub role: crate::graph::role::Role,
pub allowed_dependencies: Vec<crate::graph::layer::Layer>,
}
impl crate::graph::hex_graph::HexGraph {
pub fn get_dependencies(
&self,
id: &crate::graph::node_id::NodeId,
) -> Vec<&crate::graph::hex_node::HexNode> {
self
.edges_from(id)
.into_iter()
.filter_map(|edge| self.get_node(&edge.target))
.collect()
}
pub fn get_dependents(
&self,
id: &crate::graph::node_id::NodeId,
) -> Vec<&crate::graph::hex_node::HexNode> {
self
.edges_to(id)
.into_iter()
.filter_map(|edge| self.get_node(&edge.source))
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_layer_info() {
let info = LayerInfo {
layer: crate::graph::layer::Layer::Domain,
role: crate::graph::role::Role::Entity,
allowed_dependencies: vec![],
};
assert_eq!(info.layer, crate::graph::layer::Layer::Domain);
assert!(info.allowed_dependencies.is_empty());
}
}
#[test]
fn test_node_inspectable() {
let node = crate::graph::hex_node::HexNode::new(
crate::graph::node_id::NodeId::from_name("Test"),
crate::graph::layer::Layer::Domain,
crate::graph::role::Role::Entity,
"TestEntity",
"test::domain",
);
let layer_info = node.layer_info();
assert_eq!(layer_info.layer, crate::graph::layer::Layer::Domain);
assert_eq!(layer_info.role, crate::graph::role::Role::Entity);
assert_eq!(layer_info.type_name, "TestEntity");
let deps = node.dependencies();
assert_eq!(deps.len(), 0);
}
#[test]
fn test_graph_inspectable() {
let graph = crate::graph::hex_graph::HexGraph::new();
let layer_info = graph.layer_info();
assert_eq!(layer_info.type_name, "HexGraph");
}
}