use super::PersistCleanupState;
use crate::metadata::AchievedAtomicity;
use crate::metadata::NonSensitiveMetadata;
use crate::metadata::PublicationMethod;
use crate::metadata::UserMetadata;
use crate::path::Path;
#[derive(Clone, Debug, PartialEq)]
pub struct PersistOutcome {
target: Path,
atomicity: AchievedAtomicity,
method: PublicationMethod,
diagnostics: NonSensitiveMetadata,
cleanup_state: PersistCleanupState,
}
impl PersistOutcome {
#[inline]
#[must_use]
pub fn new(target: Path, atomicity: AchievedAtomicity, method: PublicationMethod) -> Self {
Self {
target,
atomicity,
method,
diagnostics: NonSensitiveMetadata::new(),
cleanup_state: PersistCleanupState::Complete,
}
}
#[inline]
#[must_use]
pub const fn target(&self) -> &Path {
&self.target
}
#[inline]
#[must_use]
pub const fn atomicity(&self) -> AchievedAtomicity {
self.atomicity
}
#[inline]
#[must_use]
pub const fn method(&self) -> PublicationMethod {
self.method
}
#[inline]
#[must_use]
pub const fn diagnostics(&self) -> &NonSensitiveMetadata {
&self.diagnostics
}
#[inline]
pub const fn cleanup_state(&self) -> PersistCleanupState {
self.cleanup_state
}
#[inline]
#[must_use]
pub fn with_cleanup_state(mut self, cleanup_state: PersistCleanupState) -> Self {
self.cleanup_state = cleanup_state;
self
}
#[inline]
#[must_use]
pub fn with_diagnostics(mut self, diagnostics: UserMetadata) -> Self {
self.diagnostics = NonSensitiveMetadata::from(diagnostics);
self
}
}
#[cfg(test)]
mod tests {
use super::PersistOutcome;
use crate::metadata::AchievedAtomicity;
use crate::metadata::PublicationMethod;
use crate::metadata::UserMetadata;
use crate::path::Path;
use crate::temp::PersistCleanupState;
#[test]
fn outcome_accessors_are_executed_at_runtime() {
let target = Path::parse("/target").expect("valid target path");
let outcome = PersistOutcome::new(target.clone(), AchievedAtomicity::Atomic, PublicationMethod::Direct)
.with_cleanup_state(PersistCleanupState::ResidualTemporaryContainer)
.with_diagnostics(UserMetadata::new());
assert_eq!(outcome.target(), &target);
assert_eq!(outcome.atomicity(), AchievedAtomicity::Atomic);
assert_eq!(outcome.method(), PublicationMethod::Direct);
assert_eq!(outcome.cleanup_state(), PersistCleanupState::ResidualTemporaryContainer);
assert!(outcome.diagnostics().is_empty());
}
}