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 RenameOutcome {
atomicity: AchievedAtomicity,
method: PublicationMethod,
durable: bool,
source: Path,
target: Path,
diagnostics: NonSensitiveMetadata,
}
impl RenameOutcome {
#[inline]
#[must_use]
pub fn new(source: Path, target: Path, atomicity: AchievedAtomicity, method: PublicationMethod) -> Self {
Self {
atomicity,
method,
durable: false,
source,
target,
diagnostics: NonSensitiveMetadata::new(),
}
}
#[inline]
#[must_use]
pub fn with_durable(mut self, durable: bool) -> Self {
self.durable = durable;
self
}
#[inline]
#[must_use]
pub fn with_diagnostics(mut self, diagnostics: UserMetadata) -> Self {
self.diagnostics = NonSensitiveMetadata::from(diagnostics);
self
}
#[inline]
#[must_use]
pub fn source(&self) -> &Path {
&self.source
}
#[inline]
#[must_use]
pub 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 durable(&self) -> bool {
self.durable
}
#[inline]
#[must_use]
pub const fn diagnostics(&self) -> &NonSensitiveMetadata {
&self.diagnostics
}
}
#[cfg(test)]
mod tests {
use super::RenameOutcome;
use crate::metadata::AchievedAtomicity;
use crate::metadata::PublicationMethod;
use crate::metadata::UserMetadata;
use crate::path::Path;
#[test]
fn outcome_accessors_are_executed_at_runtime() {
let source = Path::parse("/source").expect("valid source path");
let target = Path::parse("/target").expect("valid target path");
let outcome = RenameOutcome::new(
source.clone(),
target.clone(),
AchievedAtomicity::Atomic,
PublicationMethod::AtomicRename,
)
.with_durable(true)
.with_diagnostics(UserMetadata::new());
assert_eq!(outcome.source(), &source);
assert_eq!(outcome.target(), &target);
assert_eq!(outcome.atomicity(), AchievedAtomicity::Atomic);
assert_eq!(outcome.method(), PublicationMethod::AtomicRename);
assert!(outcome.durable());
assert!(outcome.diagnostics().is_empty());
}
}