use crate::error::types::SupervisorError;
use crate::id::types::ChildId;
use crate::role::adapter::job::JobRoleAdapter;
use crate::role::traits::job::JobRole;
use crate::spec::child::{ChildSpec, TaskKind};
use crate::spec::child_builder::ChildSpecBuilder;
use std::sync::Arc;
pub struct JobTemplate<T>
where
T: JobRole,
{
inner: T,
}
impl<T> JobTemplate<T>
where
T: JobRole,
{
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) -> JobRoleAdapter<T> {
JobRoleAdapter::new(self.inner)
}
pub fn child_spec(
self,
id: ChildId,
name: impl Into<String>,
) -> Result<ChildSpec, SupervisorError> {
ChildSpecBuilder::job(id, name, TaskKind::AsyncWorker, Arc::new(self.adapter())).build()
}
}