use crate::error::types::SupervisorError;
use crate::id::types::ChildId;
use crate::policy::task_role_defaults::SidecarConfig;
use crate::role::adapter::sidecar::SidecarRoleAdapter;
use crate::role::traits::sidecar::SidecarRole;
use crate::spec::child::{ChildSpec, TaskKind};
use crate::spec::child_builder::ChildSpecBuilder;
use std::sync::Arc;
pub struct SidecarTemplate<T>
where
T: SidecarRole,
{
inner: T,
primary_child_id: ChildId,
}
impl<T> SidecarTemplate<T>
where
T: SidecarRole,
{
pub fn new(inner: T, primary_child_id: ChildId) -> Self {
Self {
inner,
primary_child_id,
}
}
pub fn inner(&self) -> &T {
&self.inner
}
pub fn inner_mut(&mut self) -> &mut T {
&mut self.inner
}
pub fn primary_child_id(&self) -> &ChildId {
&self.primary_child_id
}
pub fn into_inner(self) -> T {
self.inner
}
pub fn adapter(self) -> SidecarRoleAdapter<T> {
SidecarRoleAdapter::new(self.inner, self.primary_child_id)
}
pub fn child_spec(
self,
id: ChildId,
name: impl Into<String>,
) -> Result<ChildSpec, SupervisorError> {
let primary = self.primary_child_id.clone();
ChildSpecBuilder::sidecar(
id,
name,
TaskKind::AsyncWorker,
Arc::new(self.adapter()),
SidecarConfig::new(primary, true),
)
.build()
}
}