use std::fmt::{self, Debug};
use std::marker::PhantomData;
use acktor::{ActorId, Address, Message};
use crate::actor_handle::ActorHandle;
use crate::errors::NodeError;
use crate::ipc_method::{IpcConnection, IpcListener};
use crate::remote_actor::RemoteActor;
use crate::remote_address::RemoteAddress;
use crate::session::{Session, SessionHandle};
type Result<T> = std::result::Result<T, NodeError>;
#[derive(Message)]
#[result_type(String)]
pub struct AddListener<L>(pub L)
where
L: IpcListener;
impl<L> Debug for AddListener<L>
where
L: IpcListener,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple(&format!("AddListener<{}>", acktor::utils::type_name::<L>()))
.field(&self.0.local_endpoint())
.finish()
}
}
#[derive(Debug, Message)]
#[result_type(())]
pub struct RemoveListener(pub String);
#[derive(Debug, Message)]
#[result_type(())]
pub struct AddActor<A>(pub Address<A>)
where
A: RemoteActor;
#[derive(Debug, Message)]
#[result_type(())]
pub struct RemoveActor(pub ActorId);
#[derive(Message)]
#[result_type(Result<Address<Session>>)]
pub struct Connect<C>
where
C: IpcConnection,
{
pub endpoint: String,
pub session_label: Option<String>,
pub _phantom: PhantomData<fn() -> C>,
}
impl<C> Debug for Connect<C>
where
C: IpcConnection,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct(&format!("Connect<{}>", acktor::utils::type_name::<C>()))
.field("endpoint", &self.endpoint)
.field("session_label", &self.session_label)
.finish()
}
}
impl<C> Connect<C>
where
C: IpcConnection,
{
pub fn new(endpoint: String, session_label: Option<String>) -> Self {
Self {
endpoint,
session_label,
_phantom: PhantomData,
}
}
}
#[derive(Debug, Message)]
#[result_type(Result<RemoteAddress>)]
pub struct CreateRemoteActor {
pub session: SessionHandle,
pub label: String,
pub r#type: String,
pub config: String,
}
#[derive(Debug, Message)]
#[result_type(Result<RemoteAddress>)]
pub struct GetRemoteActor {
pub session: SessionHandle,
pub actor: ActorHandle,
}