use std::future::Future;
use acton_ern::{Ern};
use async_trait::async_trait;
use dashmap::DashMap;
use tokio_util::task::TaskTracker;
use tracing::*;
use crate::common::*;
use crate::message::{BrokerRequest, MessageAddress};
use crate::traits::acton_message::ActonMessage;
#[async_trait]
pub trait Actor {
fn reply_address(&self) -> MessageAddress;
fn create_envelope(&self, recipient_address: Option<MessageAddress>) -> OutboundEnvelope;
fn children(&self) -> DashMap<String, AgentHandle>;
fn find_child(&self, arn: &Ern) -> Option<AgentHandle>;
fn tracker(&self) -> TaskTracker;
fn id(&self) -> Ern;
fn name(&self) -> String;
fn clone_ref(&self) -> AgentHandle;
#[instrument(skip(self), fields(children = self.children().len()))]
fn send(
&self,
message: impl ActonMessage,
) -> impl Future<Output=()> + Send + Sync + '_
where
Self: Sync,
{
async move {
let envelope = self.create_envelope(None);
trace!("Envelope sender is {:?}", envelope.return_address.sender.root.to_string());
envelope.send(message).await;
}
}
fn send_sync(&self, message: impl ActonMessage, recipient: &AgentHandle) -> anyhow::Result<()>
where
Self: Actor,
{
let envelope = self.create_envelope(Some(recipient.reply_address()));
envelope.reply(BrokerRequest::new(message))?;
Ok(())
}
fn stop(&self) -> impl Future<Output=anyhow::Result<()>> + Send + Sync + '_;
}