use std::future::Future;
use crate::topology::node::Node;
use crate::topology::node_id::NodeId;
#[derive(Debug, Clone, thiserror::Error)]
pub enum BrowserError {
#[error("connection failed: {0}")]
Connection(String),
#[error("not found: {0}")]
NotFound(String),
#[error("{0}")]
Other(String),
}
pub trait TopologyProvider: Send + Sync {
fn get_children(
&self,
parent_id: &NodeId,
) -> impl Future<Output = Result<Vec<Node>, BrowserError>>;
}
#[derive(Clone)]
pub struct NoopTopologyProvider;
impl TopologyProvider for NoopTopologyProvider {
async fn get_children(&self, _parent_id: &NodeId) -> Result<Vec<Node>, BrowserError> {
Ok(Vec::new())
}
}
#[derive(Clone)]
pub struct StaticTopologyProvider {
pub nodes: Vec<Node>,
}
impl TopologyProvider for StaticTopologyProvider {
async fn get_children(&self, parent_id: &NodeId) -> Result<Vec<Node>, BrowserError> {
if parent_id.segments().len() == 1 && parent_id.canonical() == "__root__" {
return Ok(self.nodes.clone());
}
for root in &self.nodes {
if let Some(node) = root.find(parent_id) {
return Ok(node.children.clone());
}
}
Err(BrowserError::NotFound(parent_id.canonical()))
}
}