use crate::error::types::SupervisorError;
use crate::id::types::ChildId;
use crate::role::adapter::worker::WorkerRoleAdapter;
use crate::role::traits::worker::WorkerRole;
use crate::spec::child::{ChildSpec, TaskKind};
use crate::spec::child_builder::ChildSpecBuilder;
use std::sync::Arc;
pub struct WorkerTemplate<T>
where
T: WorkerRole,
{
inner: T,
}
impl<T> WorkerTemplate<T>
where
T: WorkerRole,
{
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) -> WorkerRoleAdapter<T> {
WorkerRoleAdapter::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())).build()
}
}