64 lines
1.5 KiB
Rust
64 lines
1.5 KiB
Rust
// nac-multi-jurisdiction/src/discovery.rs
|
|
// Issue #59: 辖区感知节点发现
|
|
|
|
use crate::jurisdiction::JurisdictionId;
|
|
|
|
/// 辖区感知节点发现
|
|
pub struct NodeDiscovery {
|
|
known_nodes: Vec<NodeInfo>,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct NodeInfo {
|
|
pub node_id: [u8; 32],
|
|
pub jurisdiction_id: JurisdictionId,
|
|
pub endpoint: String,
|
|
pub is_active: bool,
|
|
}
|
|
|
|
impl NodeDiscovery {
|
|
pub fn new() -> Self {
|
|
NodeDiscovery { known_nodes: Vec::new() }
|
|
}
|
|
|
|
/// 注册节点
|
|
pub fn register_node(&mut self, info: NodeInfo) {
|
|
self.known_nodes.push(info);
|
|
}
|
|
|
|
/// 查找指定辖区的节点
|
|
pub fn find_by_jurisdiction(&self, jid: &JurisdictionId) -> Vec<&NodeInfo> {
|
|
self.known_nodes.iter()
|
|
.filter(|n| &n.jurisdiction_id == jid && n.is_active)
|
|
.collect()
|
|
}
|
|
|
|
/// 获取所有活跃节点数量
|
|
pub fn active_count(&self) -> usize {
|
|
self.known_nodes.iter().filter(|n| n.is_active).count()
|
|
}
|
|
}
|
|
|
|
impl Default for NodeDiscovery {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
/// 辖区感知路由器
|
|
pub struct JurisdictionAwareRouter {
|
|
discovery: NodeDiscovery,
|
|
}
|
|
|
|
impl JurisdictionAwareRouter {
|
|
pub fn new(discovery: NodeDiscovery) -> Self {
|
|
JurisdictionAwareRouter { discovery }
|
|
}
|
|
|
|
/// 路由到目标辖区
|
|
pub fn route_to(&self, target_jid: &JurisdictionId) -> Option<&NodeInfo> {
|
|
self.discovery.find_by_jurisdiction(target_jid).into_iter().next()
|
|
}
|
|
}
|
|
|