use std::sync::Arc;
use async_trait::async_trait;
use super::{Error, Result};
#[async_trait]
pub trait ReloadState: Send + Sync + Sized + 'static {
#[cfg(feature = "config")]
fn reload_config_reader(&self) -> Option<&congif::ConfigReader> {
None
}
async fn reload(&self) -> Result<()>;
}
#[async_trait]
pub trait Reloadable<S>: Send + Sync {
fn priority(&self) -> Option<u8> {
None
}
async fn reload(
&self,
state: &S,
) -> Result<()>;
}
#[derive(Debug)]
pub struct ReloadFailure {
pub(super) component: Arc<str>,
pub(super) error: Error,
}
impl ReloadFailure {
pub fn component(&self) -> &str {
&self.component
}
pub fn error(&self) -> &Error {
&self.error
}
pub fn into_error(self) -> Error {
self.error
}
}
#[derive(Debug, Default)]
#[must_use = "component reload failures are reported through ReloadOutcome"]
pub struct ReloadOutcome {
pub(super) reloaded_count: usize,
pub(super) failures: Vec<ReloadFailure>,
}
impl ReloadOutcome {
pub fn is_complete(&self) -> bool {
self.failures.is_empty()
}
pub fn reloaded_count(&self) -> usize {
self.reloaded_count
}
pub fn failed_count(&self) -> usize {
self.failures.len()
}
pub fn failures(&self) -> &[ReloadFailure] {
&self.failures
}
pub fn into_failures(self) -> Vec<ReloadFailure> {
self.failures
}
}