use std::marker::PhantomData;
use super::ActorCell;
use crate::ActorName;
use crate::Message;
use crate::MessagingErr;
use crate::SupervisionEvent;
pub struct ActorRef<TMessage> {
pub(crate) inner: ActorCell,
_tactor: PhantomData<fn() -> TMessage>,
}
impl<TMessage> Clone for ActorRef<TMessage> {
fn clone(&self) -> Self {
ActorRef {
inner: self.inner.clone(),
_tactor: PhantomData,
}
}
}
impl<TMessage> std::ops::Deref for ActorRef<TMessage> {
type Target = ActorCell;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<TMessage> From<ActorCell> for ActorRef<TMessage> {
fn from(value: ActorCell) -> Self {
Self {
inner: value,
_tactor: PhantomData,
}
}
}
impl<TActor> From<ActorRef<TActor>> for ActorCell {
fn from(value: ActorRef<TActor>) -> Self {
value.inner
}
}
impl<TMessage> std::fmt::Debug for ActorRef<TMessage> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.inner.fmt(f)
}
}
impl<TMessage> PartialEq for ActorRef<TMessage> {
fn eq(&self, other: &Self) -> bool {
self.inner == other.inner
}
}
impl<TMessage> Eq for ActorRef<TMessage> {}
impl<TMessage> std::hash::Hash for ActorRef<TMessage> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.inner.hash(state);
}
}
impl<TMessage> ActorRef<TMessage> {
pub fn get_cell(&self) -> ActorCell {
self.inner.clone()
}
pub fn notify_supervisor_and_monitors(&self, evt: SupervisionEvent) {
self.inner.notify_supervisor(evt)
}
}
impl<TMessage> crate::actor::ActorRef<TMessage>
where
TMessage: Message,
{
pub fn send_message(&self, message: TMessage) -> Result<(), MessagingErr<TMessage>> {
self.inner.inner.send_message_unchecked::<TMessage>(message)
}
pub fn where_is(name: ActorName) -> Option<crate::actor::ActorRef<TMessage>> {
if let Some(actor) = crate::registry::where_is(name) {
let check = actor.is_message_type_of::<TMessage>();
if check.is_none() || matches!(check, Some(true)) {
return Some(actor.into());
}
}
None
}
}