diff --git a/src/actor/actor_cell.rs b/src/actor/actor_cell.rs index 8ee860e6..ff541beb 100644 --- a/src/actor/actor_cell.rs +++ b/src/actor/actor_cell.rs @@ -17,7 +17,7 @@ use crate::{ actor::{props::ActorFactory, *}, kernel::{ kernel_ref::{dispatch, dispatch_any, KernelRef}, - mailbox::{AnySender, MailboxSender}, + mailbox::{AnyEnqueueError, AnySender, MailboxSender}, }, system::{ timer::{Job, OnceJob, RepeatJob, ScheduleId, Timer}, @@ -124,7 +124,7 @@ impl ActorCell { &self, msg: &mut AnyMessage, sender: crate::actor::Sender, - ) -> Result<(), ()> { + ) -> Result<(), AnyEnqueueError> { let mb = &self.inner.mailbox; let k = self.kernel(); @@ -603,7 +603,7 @@ where T: Message + Into, M: Message, { - let delay = std::cmp::max(time.timestamp() - Utc::now().timestamp(), 0 as i64); + let delay = std::cmp::max(time.timestamp() - Utc::now().timestamp(), 0_i64); let delay = Duration::from_secs(delay as u64); let id = Uuid::new_v4(); diff --git a/src/actor/actor_ref.rs b/src/actor/actor_ref.rs index cc6df092..1123910a 100644 --- a/src/actor/actor_ref.rs +++ b/src/actor/actor_ref.rs @@ -6,6 +6,7 @@ use crate::{ props::{ActorArgs, ActorFactory, ActorFactoryArgs}, Actor, ActorPath, ActorUri, BoxActorProd, CreateError, }, + kernel::mailbox::AnyEnqueueError, system::{ActorSystem, SystemMsg}, AnyMessage, Envelope, Message, }; @@ -192,7 +193,7 @@ impl BasicActorRef { &self, msg: Msg, sender: impl Into>, - ) -> Result<(), ()> + ) -> Result<(), AnyEnqueueError> where Msg: Message + Send, { @@ -203,7 +204,7 @@ impl BasicActorRef { &self, msg: &mut AnyMessage, sender: impl Into>, - ) -> Result<(), ()> { + ) -> Result<(), AnyEnqueueError> { self.cell.send_any_msg(msg, sender.into()) } } diff --git a/src/kernel/kernel_ref.rs b/src/kernel/kernel_ref.rs index cf4e36bd..6c235c46 100644 --- a/src/kernel/kernel_ref.rs +++ b/src/kernel/kernel_ref.rs @@ -5,7 +5,7 @@ use futures::{channel::mpsc::Sender, task::SpawnExt, SinkExt}; use crate::{ actor::{MsgError, MsgResult}, kernel::{ - mailbox::{AnySender, MailboxSchedule, MailboxSender}, + mailbox::{AnyEnqueueError, AnySender, MailboxSchedule, MailboxSender}, KernelMsg, }, system::ActorSystem, @@ -72,18 +72,13 @@ pub fn dispatch_any( mbox: &Arc, kernel: &KernelRef, sys: &ActorSystem, -) -> Result<(), ()> { - match mbox.try_any_enqueue(msg, sender) { - Ok(_) => { - if !mbox.is_sched() { - mbox.set_sched(true); - kernel.schedule(sys); - } - - Ok(()) +) -> Result<(), AnyEnqueueError> { + mbox.try_any_enqueue(msg, sender).map(|_| { + if !mbox.is_sched() { + mbox.set_sched(true); + kernel.schedule(sys); } - Err(_) => Err(()), - } + }) } unsafe impl Send for KernelRef {} diff --git a/src/kernel/mailbox.rs b/src/kernel/mailbox.rs index 6a6f3cbd..eee60cc3 100644 --- a/src/kernel/mailbox.rs +++ b/src/kernel/mailbox.rs @@ -24,8 +24,17 @@ pub trait MailboxSchedule { fn is_scheduled(&self) -> bool; } +#[derive(Debug)] +pub struct AnyEnqueueError; + +impl From<()> for AnyEnqueueError { + fn from(_: ()) -> AnyEnqueueError { + AnyEnqueueError + } +} + pub trait AnySender: Send + Sync { - fn try_any_enqueue(&self, msg: &mut AnyMessage, sender: Sender) -> Result<(), ()>; + fn try_any_enqueue(&self, msg: &mut AnyMessage, sender: Sender) -> Result<(), AnyEnqueueError>; fn set_sched(&self, b: bool); @@ -64,13 +73,13 @@ impl AnySender for MailboxSender where Msg: Message, { - fn try_any_enqueue(&self, msg: &mut AnyMessage, sender: Sender) -> Result<(), ()> { - let actual = msg.take()?; + fn try_any_enqueue(&self, msg: &mut AnyMessage, sender: Sender) -> Result<(), AnyEnqueueError> { + let actual = msg.take().map_err(|_| AnyEnqueueError)?; let msg = Envelope { msg: actual, sender, }; - self.try_enqueue(msg).map_err(|_| ()) + self.try_enqueue(msg).map_err(|_| AnyEnqueueError) } fn set_sched(&self, b: bool) { diff --git a/src/lib.rs b/src/lib.rs index 413c3cab..b3a81be1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,6 +64,8 @@ pub struct AnyMessage { pub msg: Option>, } +pub struct DowncastAnyMessageError; + impl AnyMessage { pub fn new(msg: T, one_time: bool) -> Self where @@ -75,7 +77,7 @@ impl AnyMessage { } } - pub fn take(&mut self) -> Result + pub fn take(&mut self) -> Result where T: Any + Message, { @@ -85,16 +87,16 @@ impl AnyMessage { if m.is::() { Ok(*m.downcast::().unwrap()) } else { - Err(()) + Err(DowncastAnyMessageError) } } - None => Err(()), + None => Err(DowncastAnyMessageError), } } else { match self.msg.as_ref() { Some(m) if m.is::() => Ok(m.downcast_ref::().cloned().unwrap()), - Some(_) => Err(()), - None => Err(()), + Some(_) => Err(DowncastAnyMessageError), + None => Err(DowncastAnyMessageError), } } } diff --git a/src/system.rs b/src/system.rs index a707875e..72e9a060 100644 --- a/src/system.rs +++ b/src/system.rs @@ -760,7 +760,7 @@ impl Timer for ActorSystem { T: Message + Into, M: Message, { - let delay = std::cmp::max(time.timestamp() - Utc::now().timestamp(), 0 as i64); + let delay = std::cmp::max(time.timestamp() - Utc::now().timestamp(), 0_i64); let delay = Duration::from_secs(delay as u64); let id = Uuid::new_v4();