core/src/raw/oio/delete/api.rs (84 lines of code) (raw):
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use crate::raw::{BoxedFuture, MaybeSend, OpDelete};
use crate::*;
use std::future::Future;
use std::ops::DerefMut;
/// Deleter is a type erased [`Delete`]
pub type Deleter = Box<dyn DeleteDyn>;
/// The Delete trait defines interfaces for performing deletion operations.
pub trait Delete: Unpin + Send + Sync {
/// Requests deletion of a resource at the specified path with optional arguments
///
/// # Parameters
/// - `path`: The path of the resource to delete
/// - `args`: Additional arguments for the delete operation
///
/// # Returns
/// - `Ok(())`: The deletion request has been successfully queued (does not guarantee actual deletion)
/// - `Err(err)`: An error occurred and the deletion request was not queued
///
/// # Notes
/// This method just queue the delete request. The actual deletion will be
/// performed when `flush` is called.
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()>;
/// Flushes the deletion queue to ensure queued deletions are executed
///
/// # Returns
/// - `Ok(0)`: All queued deletions have been processed or the queue is empty.
/// - `Ok(count)`: The number of resources successfully deleted. Implementations should
/// return an error if the queue is non-empty but no resources were deleted
/// - `Err(err)`: An error occurred while performing the deletions
///
/// # Notes
/// - This method is asynchronous and will wait for queued deletions to complete
fn flush(&mut self) -> impl Future<Output = Result<usize>> + MaybeSend;
}
impl Delete for () {
fn delete(&mut self, _: &str, _: OpDelete) -> Result<()> {
Err(Error::new(
ErrorKind::Unsupported,
"output deleter doesn't support delete",
))
}
async fn flush(&mut self) -> Result<usize> {
Err(Error::new(
ErrorKind::Unsupported,
"output deleter doesn't support flush",
))
}
}
/// The dyn version of [`Delete`]
pub trait DeleteDyn: Unpin + Send + Sync {
/// The dyn version of [`Delete::delete`]
fn delete_dyn(&mut self, path: &str, args: OpDelete) -> Result<()>;
/// The dyn version of [`Delete::flush`]
fn flush_dyn(&mut self) -> BoxedFuture<Result<usize>>;
}
impl<T: Delete + ?Sized> DeleteDyn for T {
fn delete_dyn(&mut self, path: &str, args: OpDelete) -> Result<()> {
Delete::delete(self, path, args)
}
fn flush_dyn(&mut self) -> BoxedFuture<Result<usize>> {
Box::pin(self.flush())
}
}
impl<T: DeleteDyn + ?Sized> Delete for Box<T> {
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
self.deref_mut().delete_dyn(path, args)
}
async fn flush(&mut self) -> Result<usize> {
self.deref_mut().flush_dyn().await
}
}
/// BlockingDeleter is a type erased [`BlockingDelete`]
pub type BlockingDeleter = Box<dyn BlockingDelete>;
/// BlockingDelete is the trait to perform delete operations.
pub trait BlockingDelete: Send + Sync + 'static {
/// Delete given path with optional arguments.
///
/// # Behavior
///
/// - `Ok(())` means the path has been queued for deletion.
/// - `Err(err)` means error happens and no deletion has been queued.
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()>;
/// Flushes the deletion queue to ensure queued deletions are executed
///
/// # Returns
/// - `Ok(0)`: All queued deletions have been processed or the queue is empty.
/// - `Ok(count)`: The number of resources successfully deleted. Implementations should
/// return an error if the queue is non-empty but no resources were deleted
/// - `Err(err)`: An error occurred while performing the deletions
fn flush(&mut self) -> Result<usize>;
}
impl BlockingDelete for () {
fn delete(&mut self, _: &str, _: OpDelete) -> Result<()> {
Err(Error::new(
ErrorKind::Unsupported,
"output deleter doesn't support delete",
))
}
fn flush(&mut self) -> Result<usize> {
Err(Error::new(
ErrorKind::Unsupported,
"output deleter doesn't support flush",
))
}
}
/// `Box<dyn BlockingDelete>` won't implement `BlockingDelete` automatically.
///
/// To make BlockingWriter work as expected, we must add this impl.
impl<T: BlockingDelete + ?Sized> BlockingDelete for Box<T> {
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
(**self).delete(path, args)
}
fn flush(&mut self) -> Result<usize> {
(**self).flush()
}
}