use crate::error::FsError;
use crate::error::FsErrorKind;
use crate::error::FsOperation;
use crate::metadata::FileSystemCapabilities;
use crate::metadata::FileSystemCapability;
use crate::metadata::ResourceVersion;
#[non_exhaustive]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct DeleteOptions {
recursive: bool,
missing_ok: bool,
if_match: Option<ResourceVersion>,
}
impl DeleteOptions {
#[inline]
#[must_use]
pub const fn recursive(&self) -> bool {
self.recursive
}
#[inline]
#[must_use]
pub const fn missing_ok(&self) -> bool {
self.missing_ok
}
#[inline]
#[must_use]
pub const fn if_match(&self) -> Option<&ResourceVersion> {
self.if_match.as_ref()
}
#[inline]
#[must_use]
pub const fn with_recursive(mut self, recursive: bool) -> Self {
self.recursive = recursive;
self
}
#[inline]
#[must_use]
pub const fn with_missing_ok(mut self, missing_ok: bool) -> Self {
self.missing_ok = missing_ok;
self
}
#[inline]
#[must_use]
pub fn with_if_match(mut self, if_match: Option<ResourceVersion>) -> Self {
self.if_match = if_match;
self
}
pub fn validate_against(&self, capabilities: FileSystemCapabilities) -> Result<(), FsError> {
if self.recursive() && !capabilities.supports(FileSystemCapability::RecursiveDelete) {
return Err(missing_requirement(
FileSystemCapability::RecursiveDelete,
"recursive deletion is required but not supported",
));
}
if self.if_match().is_some() && !capabilities.supports(FileSystemCapability::ConditionalDelete) {
return Err(missing_requirement(
FileSystemCapability::ConditionalDelete,
"conditional deletion is required but not supported",
));
}
Ok(())
}
}
fn missing_requirement(capability: FileSystemCapability, message: &str) -> FsError {
FsError::new(FsErrorKind::RequirementNotMet, FsOperation::Delete, message).with_required_capability(capability)
}