use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HeartbeatPolicy {
pub allow_degraded_on_offline: bool,
}
impl Default for HeartbeatPolicy {
fn default() -> Self {
Self {
allow_degraded_on_offline: true,
}
}
}
pub struct ControlPlaneCoordinator<C> {
client: C,
policy: HeartbeatPolicy,
}
impl<C> ControlPlaneCoordinator<C>
where
C: ControlPlaneProvider,
{
pub fn new(client: C, policy: HeartbeatPolicy) -> Self {
Self { client, policy }
}
pub async fn heartbeat_once(
&self,
request: HeartbeatRequest,
) -> ControlPlaneResult<RuntimeOperationalMode> {
match self.client.heartbeat(request).await {
Ok(response) => Ok(response.operation_mode),
Err(ControlPlaneError::Offline) if self.policy.allow_degraded_on_offline => {
Ok(RuntimeOperationalMode::Degraded)
}
Err(error) => Err(error),
}
}
}