use crate::common::tsafe::TSafe;
use crate::actors::actor_cell::ActorCell;
use crate::actors::abstract_actor_ref::{ActorRef, AbstractActorRef};
use crate::actors::actor_path::ActorPath;
use crate::actors::actor::Actor;
use std::fmt;
use std::any::Any;
pub struct TestLocalActorRef {
pub cell: TSafe<ActorCell>,
pub path: TSafe<ActorPath>,
pub actor: TSafe<Actor + Send>
}
impl TestLocalActorRef {
pub fn new(cell: TSafe<ActorCell>, path: TSafe<ActorPath>) -> TestLocalActorRef {
let actor = cell.clone().lock().unwrap().actor.clone();
TestLocalActorRef {
cell,
path,
actor
}
}
fn inner_clone(self: &Self) -> Box<TestLocalActorRef> {
Box::new(TestLocalActorRef {
cell: self.cell.clone(),
path: self.path.clone(),
actor: self.actor.clone()
})
}
}
impl AbstractActorRef for TestLocalActorRef {
fn tell(self: &mut Self, msg: Box<Any + Send + 'static>, rself: Option<Box<AbstractActorRef + Send>>) {
let cell_cloned = self.cell.clone();
let path_cloned = self.path.clone();
let toref = Box::new(TestLocalActorRef::new(cell_cloned, path_cloned));
let mut cell = self.cell.lock().unwrap();
cell.send(&self.cell, msg, rself, toref)
}
fn path(self: &mut Self) -> ActorPath {
self.path.lock().unwrap().clone()
}
fn cell(self: &mut Self) -> TSafe<ActorCell> {
self.cell.clone()
}
fn clone(self: &Self) -> ActorRef {
self.inner_clone()
}
fn as_any(self: &Self) -> Box<Any> {
Box::new(self.inner_clone())
}
}
impl fmt::Display for TestLocalActorRef {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TestActorRef ({})", self.path.lock().unwrap())
}
}
impl PartialEq for TestLocalActorRef {
fn eq(&self, _other: &Self) -> bool {
true
}
}
impl Eq for TestLocalActorRef {}