use crate::error::types::SupervisorError;
use crate::id::types::ChildId;
use crate::policy::task_role_defaults::TaskRole;
use crate::role::adapter::supervisor::SupervisorRoleAdapter;
use crate::role::traits::supervisor::SupervisorRole;
use crate::spec::child::{ChildSpec, Criticality, TaskKind};
use crate::spec::child_builder::ChildSpecBuilder;
use std::sync::Arc;
pub struct SupervisorTemplate<T>
where
T: SupervisorRole,
{
inner: T,
}
impl<T> SupervisorTemplate<T>
where
T: SupervisorRole,
{
pub fn new(inner: T) -> Self {
Self { inner }
}
pub fn inner(&self) -> &T {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut T {
&mut self.inner
}
pub fn into_inner(self) -> T {
self.inner
}
pub fn adapter(self) -> SupervisorRoleAdapter<T> {
SupervisorRoleAdapter::new(self.inner)
}
pub fn child_spec(
self,
id: ChildId,
name: impl Into<String>,
) -> Result<ChildSpec, SupervisorError> {
ChildSpecBuilder::worker(id, name, TaskKind::AsyncWorker, Arc::new(self.adapter()))
.task_role(TaskRole::Supervisor)
.criticality(Criticality::Critical)
.build()
}
}