use std::collections::HashMap;
use tokio::sync::RwLock;
use crate::ids::{AureliaError, ErrorId, TabernaId};
use crate::peering::address::DomusAddr;
use crate::peering::routing::RouteResolver;
pub struct SimpleResolver {
inner: RwLock<SimpleResolverState>,
}
struct SimpleResolverState {
routes: HashMap<TabernaId, DomusAddr>,
}
impl SimpleResolver {
pub fn new() -> Self {
Self {
inner: RwLock::new(SimpleResolverState {
routes: HashMap::new(),
}),
}
}
pub async fn insert(&self, taberna_id: TabernaId, domus: DomusAddr) {
let mut guard = self.inner.write().await;
guard.routes.insert(taberna_id, domus);
}
pub async fn remove(&self, taberna_id: TabernaId) {
let mut guard = self.inner.write().await;
guard.routes.remove(&taberna_id);
}
pub async fn clear_all(&self) {
let mut guard = self.inner.write().await;
guard.routes.clear();
}
}
impl Default for SimpleResolver {
fn default() -> Self {
Self::new()
}
}
#[async_trait::async_trait]
impl RouteResolver for SimpleResolver {
async fn resolve(&self, taberna_id: TabernaId) -> Result<DomusAddr, AureliaError> {
let guard = self.inner.read().await;
guard
.routes
.get(&taberna_id)
.cloned()
.ok_or_else(|| AureliaError::new(ErrorId::UnknownTaberna))
}
}