use super::*;
use crate::routing::groups::StorePolicy;
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum RegistrationError {
DuplicateEntry,
Unsupported,
InvalidPath(PathParseError),
}
pub type RegistrationResult = Result<ActorPath, RegistrationError>;
#[derive(Debug)]
pub enum RegistrationPromise {
Fulfil(utils::KPromise<RegistrationResult>),
None,
}
#[derive(Debug)]
pub struct ActorRegistration {
pub actor: DynActorRef,
pub path: PathResolvable,
}
#[derive(Debug)]
pub struct PolicyRegistration {
pub policy: StorePolicy,
pub path: Vec<String>,
}
#[derive(Debug)]
pub enum RegistrationEvent {
Actor(ActorRegistration),
Policy(PolicyRegistration),
}
impl From<ActorRegistration> for RegistrationEvent {
fn from(r: ActorRegistration) -> Self {
RegistrationEvent::Actor(r)
}
}
impl From<PolicyRegistration> for RegistrationEvent {
fn from(r: PolicyRegistration) -> Self {
RegistrationEvent::Policy(r)
}
}
#[derive(Debug)]
pub struct RegistrationEnvelope {
pub event: RegistrationEvent,
pub update: bool,
pub promise: RegistrationPromise,
}
impl RegistrationEnvelope {
pub fn actor(actor: DynActorRef, path: PathResolvable, update: bool) -> Self {
let event = ActorRegistration { actor, path };
RegistrationEnvelope {
event: event.into(),
update,
promise: RegistrationPromise::None,
}
}
pub fn actor_with_promise(
actor: DynActorRef,
path: PathResolvable,
update: bool,
promise: utils::KPromise<RegistrationResult>,
) -> Self {
let event = ActorRegistration { actor, path };
RegistrationEnvelope {
event: event.into(),
update,
promise: RegistrationPromise::Fulfil(promise),
}
}
pub fn policy<P>(policy: P, path: Vec<String>, update: bool) -> Self
where
P: Into<StorePolicy>,
{
let event = PolicyRegistration {
policy: policy.into(),
path,
};
RegistrationEnvelope {
event: event.into(),
update,
promise: RegistrationPromise::None,
}
}
pub fn policy_with_promise<P>(
policy: P,
path: Vec<String>,
update: bool,
promise: utils::KPromise<RegistrationResult>,
) -> Self
where
P: Into<StorePolicy>,
{
let event = PolicyRegistration {
policy: policy.into(),
path,
};
RegistrationEnvelope {
event: event.into(),
update,
promise: RegistrationPromise::Fulfil(promise),
}
}
}