use crate::error::FsError;
use crate::error::FsErrorKind;
use crate::error::FsOperation;
use crate::metadata::AtomicityRequirement;
use crate::metadata::DurabilityRequirement;
use crate::metadata::FileSystemCapabilities;
use crate::metadata::FileSystemCapability;
#[non_exhaustive]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RenameOptions {
overwrite: bool,
atomicity: AtomicityRequirement,
durability: DurabilityRequirement,
}
impl Default for RenameOptions {
#[inline]
fn default() -> Self {
Self {
overwrite: false,
atomicity: AtomicityRequirement::Preferred,
durability: DurabilityRequirement::NotRequired,
}
}
}
impl RenameOptions {
#[inline]
#[must_use]
pub const fn overwrite(&self) -> bool {
self.overwrite
}
#[inline]
#[must_use]
pub const fn atomicity(&self) -> AtomicityRequirement {
self.atomicity
}
#[inline]
#[must_use]
pub const fn durability(&self) -> DurabilityRequirement {
self.durability
}
#[inline]
#[must_use]
pub const fn with_overwrite(mut self, overwrite: bool) -> Self {
self.overwrite = overwrite;
self
}
#[inline]
#[must_use]
pub const fn with_atomicity(mut self, atomicity: AtomicityRequirement) -> Self {
self.atomicity = atomicity;
self
}
#[inline]
#[must_use]
pub const fn with_durability(mut self, durability: DurabilityRequirement) -> Self {
self.durability = durability;
self
}
pub fn validate_against(&self, capabilities: FileSystemCapabilities) -> Result<(), FsError> {
if self.atomicity() == AtomicityRequirement::Required
&& !capabilities.supports(FileSystemCapability::AtomicRename)
{
return Err(FsError::new(
FsErrorKind::RequirementNotMet,
FsOperation::Rename,
"atomic rename is required but not supported",
)
.with_required_capability(FileSystemCapability::AtomicRename));
}
if self.durability() == DurabilityRequirement::Required
&& !capabilities.supports(FileSystemCapability::DurableRename)
{
return Err(FsError::new(
FsErrorKind::RequirementNotMet,
FsOperation::Rename,
"durable rename is required but not supported",
)
.with_required_capability(FileSystemCapability::DurableRename));
}
Ok(())
}
}