use std::collections::HashMap;
use std::sync::{Arc, Mutex, OnceLock};
use ntk_rpc::RpcClient;
use crate::node::registry::LinkId;
#[derive(Default)]
pub struct PeerLinks {
clients: Mutex<HashMap<LinkId, Arc<dyn RpcClient>>>,
port: OnceLock<u16>,
}
impl std::fmt::Debug for PeerLinks {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PeerLinks").finish_non_exhaustive()
}
}
impl PeerLinks {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn set_port(&self, port: u16) {
let _ = self.port.set(port);
}
#[must_use]
pub fn port(&self) -> Option<u16> {
self.port.get().copied()
}
pub fn insert(&self, link: LinkId, client: Arc<dyn RpcClient>) {
self.clients
.lock()
.unwrap_or_else(|e| e.into_inner())
.insert(link, client);
}
pub fn remove(&self, link: LinkId) {
self.clients
.lock()
.unwrap_or_else(|e| e.into_inner())
.remove(&link);
}
#[must_use]
pub fn get(&self, link: LinkId) -> Option<Arc<dyn RpcClient>> {
self.clients
.lock()
.unwrap_or_else(|e| e.into_inner())
.get(&link)
.cloned()
}
#[must_use]
pub fn all(&self) -> Vec<(LinkId, Arc<dyn RpcClient>)> {
self.clients
.lock()
.unwrap_or_else(|e| e.into_inner())
.iter()
.map(|(id, c)| (*id, c.clone()))
.collect()
}
}