use std::sync::Arc;
use anyhow::Result;
use super::{context::Context, runner::Actor};
pub trait Message: 'static + Send {
type Result: 'static + Send;
}
#[async_trait::async_trait]
pub trait Handler<T: Message>: Actor {
async fn handle(&self, ctx: &Context, msg: T) -> Result<T::Result>;
}
#[async_trait::async_trait]
impl<T: Message> Handler<T> for Arc<dyn Handler<T>> {
async fn handle(&self, ctx: &Context, msg: T) -> Result<T::Result> {
(**self).handle(ctx, msg).await
}
}
#[async_trait::async_trait]
impl<T: Message> Actor for Arc<dyn Handler<T>> {}