use std::any::Any;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use actors::{Actor, ActorCell, ActorContext, ActorPath, ActorRef};
#[derive(Clone)]
pub enum ResolveRequest {
Add(ActorRef),
Remove(Arc<ActorPath>),
Get(String),
}
pub struct NameResolver {
index: Mutex<HashMap<Arc<ActorPath>, ActorRef>>,
}
impl Actor for NameResolver {
fn receive(&self, message: Box<Any>, context: ActorCell) {
if let Ok(message) = Box::<Any>::downcast::<ResolveRequest>(message) {
match *message {
ResolveRequest::Add(address) => {
let mut index = self.index.lock().unwrap();
index.insert(address.path(), address);
}
ResolveRequest::Remove(address) => {
let mut index = self.index.lock().unwrap();
index.remove(&address);
}
ResolveRequest::Get(address) => {
let index = self.index.lock().unwrap();
context.complete(context.sender(), index.get(&ActorPath::new_local(address)).cloned());
}
}
}
}
}
impl NameResolver {
pub fn new(_dummy: ()) -> NameResolver {
NameResolver { index: Mutex::new(HashMap::new()) }
}
}