use super::{
AttemptJournalError, BackupLayoutGuard, OperationPlanPersistenceError, read_operation_plan,
};
use crate::{
model::{
artifacts::ArtifactChecksumRecord, attempt_journal::AttemptJournalRecord,
operation_plan::OperationPlanError,
},
policy::execution_progress::{
ExecutionProgressError, ExecutionProgressRequest, ExecutionProgressView, progress,
},
};
use thiserror::Error;
pub fn read_execution_progress(
layout: &BackupLayoutGuard,
expected_plan: &ArtifactChecksumRecord,
) -> Result<ExecutionProgressView, ExecutionProgressPersistenceError> {
read_with_current(layout, expected_plan, None)
}
pub(super) fn read_with_current(
layout: &BackupLayoutGuard,
expected_plan: &ArtifactChecksumRecord,
current: Option<&AttemptJournalRecord>,
) -> Result<ExecutionProgressView, ExecutionProgressPersistenceError> {
let plan = read_operation_plan(layout, expected_plan)?;
let authorities = plan.attempt_authorities()?;
let journals = super::attempt_journal::read_original_journals(layout, &authorities, current)?;
let references: Vec<_> = journals.iter().collect();
Ok(progress(&ExecutionProgressRequest {
plan: &plan,
journals: &references,
})?)
}
#[derive(Debug, Error)]
pub enum ExecutionProgressPersistenceError {
#[error(transparent)]
Plan(#[from] OperationPlanPersistenceError),
#[error(transparent)]
Authority(#[from] OperationPlanError),
#[error(transparent)]
Journal(#[from] AttemptJournalError),
#[error(transparent)]
Policy(#[from] ExecutionProgressError),
#[error("operation {0} has unapplied prerequisites")]
DependenciesUnapplied(u64),
}
#[cfg(all(test, unix))]
mod tests;