use super::rename_outcome_validation_error::RenameOutcomeValidationError;
use crate::metadata::AchievedAtomicity;
use crate::metadata::DurabilityRequirement;
use crate::metadata::PublicationMethod;
use crate::path::Path;
use crate::rename::RenameFailureState;
use crate::rename::RenameOptions;
use crate::rename::RenameOutcome;
pub(crate) fn validate_rename_outcome(
outcome: &RenameOutcome,
options: &RenameOptions,
source: &Path,
target: &Path,
) -> Option<RenameOutcomeValidationError> {
if options.atomicity() == crate::metadata::AtomicityRequirement::Required
&& outcome.atomicity() != AchievedAtomicity::Atomic
{
return Some(RenameOutcomeValidationError {
message: "provider reported non-atomic success for an atomic-required rename",
state: RenameFailureState::Renamed,
});
}
if outcome.method() == PublicationMethod::CopyThenDelete {
return Some(RenameOutcomeValidationError {
message: "provider returned copy-then-delete for rename",
state: RenameFailureState::Renamed,
});
}
if options.durability() == DurabilityRequirement::Required && !outcome.durable() {
return Some(RenameOutcomeValidationError {
message: "provider reported non-durable success for a durability-required rename",
state: RenameFailureState::Renamed,
});
}
if outcome.source() != source || outcome.target() != target {
return Some(RenameOutcomeValidationError {
message: "provider returned a rename outcome with different identities",
state: RenameFailureState::Indeterminate,
});
}
None
}