opendal/services/monoiofs/
delete.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18use std::sync::Arc;
19
20use super::core::MonoiofsCore;
21use crate::raw::*;
22use crate::*;
23
24pub struct MonoiofsDeleter {
25    core: Arc<MonoiofsCore>,
26}
27
28impl MonoiofsDeleter {
29    pub fn new(core: Arc<MonoiofsCore>) -> Self {
30        Self { core }
31    }
32}
33
34impl oio::OneShotDelete for MonoiofsDeleter {
35    async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
36        let path = self.core.prepare_path(&path);
37        let meta = self
38            .core
39            .dispatch({
40                let path = path.clone();
41                move || monoio::fs::metadata(path)
42            })
43            .await;
44        match meta {
45            Ok(meta) => {
46                if meta.is_dir() {
47                    self.core
48                        .dispatch(move || monoio::fs::remove_dir(path))
49                        .await
50                        .map_err(new_std_io_error)?;
51                } else {
52                    self.core
53                        .dispatch(move || monoio::fs::remove_file(path))
54                        .await
55                        .map_err(new_std_io_error)?;
56                }
57
58                Ok(())
59            }
60            Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(()),
61            Err(err) => Err(new_std_io_error(err)),
62        }
63    }
64}