use std::sync::Arc;
use async_trait::async_trait;
use super::{Error, Result};
#[async_trait]
pub trait Finalizable<S>: Send + Sync {
async fn finalize(
&self,
state: &S,
) -> Result<()>;
}
#[derive(Debug)]
pub struct FinalizeFailure {
pub(super) component: Arc<str>,
pub(super) error: Error,
}
impl FinalizeFailure {
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 finalization failures are reported through FinalizeOutcome"]
pub struct FinalizeOutcome {
pub(super) finalized_count: usize,
pub(super) failures: Vec<FinalizeFailure>,
}
impl FinalizeOutcome {
pub fn is_complete(&self) -> bool {
self.failures.is_empty()
}
pub fn finalized_count(&self) -> usize {
self.finalized_count
}
pub fn failed_count(&self) -> usize {
self.failures.len()
}
pub fn failures(&self) -> &[FinalizeFailure] {
&self.failures
}
pub fn into_failures(self) -> Vec<FinalizeFailure> {
self.failures
}
}