NAC_Blockchain/nac-multi-jurisdiction/src/discovery.rs

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()
}
}