use crate::control::handle::SupervisorHandle;
use crate::role::context::supervisor::SupervisorContext;
use crate::role::lifecycle::RoleLifecyclePhase;
use crate::role::result::supervisor::{SupervisorResult, SupervisorRoleError};
use crate::spec::supervisor::SupervisorSpec;
use std::future::Future;
pub trait SupervisorRole: Send + 'static {
fn build_tree<'a>(
&'a mut self,
ctx: &'a SupervisorContext,
) -> impl Future<Output = SupervisorResult<SupervisorSpec>> + Send + 'a;
fn run<'a>(
&'a mut self,
ctx: &'a SupervisorContext,
handle: &'a SupervisorHandle,
) -> impl Future<Output = SupervisorResult<()>> + Send + 'a {
async move {
let _ = handle;
ctx.wait_shutdown().await;
Ok(())
}
}
fn shutdown<'a>(
&'a mut self,
ctx: &'a SupervisorContext,
handle: &'a SupervisorHandle,
) -> impl Future<Output = SupervisorResult<()>> + Send + 'a {
async move {
let shutdown_tree_result = handle
.shutdown_tree("role-adapter", "nested supervisor shutdown")
.await
.map_err(|error| {
SupervisorRoleError::from_supervisor_error(
ctx.child_id().clone(),
RoleLifecyclePhase::Shutdown,
error,
)
});
let control_plane_result = handle
.shutdown("role-adapter", "nested supervisor shutdown")
.await
.map(|_report| ())
.map_err(|error| {
SupervisorRoleError::from_supervisor_error(
ctx.child_id().clone(),
RoleLifecyclePhase::Shutdown,
error,
)
});
let join_result = handle.join().await.map(|_report| ()).map_err(|error| {
SupervisorRoleError::from_supervisor_error(
ctx.child_id().clone(),
RoleLifecyclePhase::Shutdown,
error,
)
});
shutdown_tree_result?;
control_plane_result?;
join_result?;
Ok(())
}
}
}