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