use async_std::sync::{Arc, Mutex};
use identity::Identity;
use netmod::Target;
use std::collections::BTreeMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct EpTargetPair(pub(crate) u8, pub(crate) Target);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum RouteType {
Remote(EpTargetPair),
Local,
}
#[derive(Default)]
pub(crate) struct RouteTable {
routes: Arc<Mutex<BTreeMap<Identity, RouteType>>>,
}
impl RouteTable {
pub(crate) fn new() -> Arc<Self> {
Arc::new(Self::default())
}
pub(crate) async fn update(&self, ep: EpTargetPair, id: Identity) {
let mut tbl = self.routes.lock().await;
tbl.remove(&id);
tbl.insert(id, RouteType::Remote(ep)).unwrap();
}
pub(crate) async fn delete(&self, id: Identity) {
self.routes.lock().await.remove(&id);
}
pub(crate) async fn resolve(&self, id: Identity) -> EpTargetPair {
match self.routes.lock().await.get(&id).cloned().unwrap() {
RouteType::Remote(ep) => ep,
_ => unreachable!(),
}
}
pub(crate) async fn reachable(&self, id: Identity) -> Option<RouteType> {
self.routes.lock().await.get(&id).cloned()
}
}