pcloud/folder/
delete.rs

1use super::{Folder, FolderIdentifier, FolderResponse};
2
3/// Result payload from a recursive folder deletion request.
4///
5/// Returned by the `deletefolderrecursive` endpoint, it provides
6/// information about how many files and folders were deleted in total.
7#[derive(Debug, serde::Deserialize)]
8pub struct RecursivePayload {
9    /// The total number of files deleted.
10    #[serde(rename = "deletedfiles")]
11    pub deleted_files: usize,
12
13    /// The total number of folders deleted.
14    #[serde(rename = "deletedfolders")]
15    pub deleted_folders: usize,
16}
17
18impl crate::Client {
19    /// Deletes an empty folder from pCloud.
20    ///
21    /// This function calls the `deletefolder` API endpoint. It will fail
22    /// if the folder is not empty or cannot be deleted.
23    ///
24    /// # Arguments
25    ///
26    /// * `identifier` - A value that can be converted into a [`FolderIdentifier`] (e.g., folder ID or path).
27    ///
28    /// # Returns
29    ///
30    /// On success, returns the metadata of the deleted folder as a [`Folder`] object.
31    ///
32    /// # Errors
33    ///
34    /// Returns a [`crate::Error`] if the folder does not exist, is not empty, or the API call fails.
35    ///
36    /// # Examples
37    ///
38    /// ```rust,no_run
39    /// # async fn example(client: &pcloud::Client) -> Result<(), pcloud::Error> {
40    /// let folder = client.delete_folder("/my/empty/folder").await?;
41    /// println!("Deleted folder: {}", folder.base.name);
42    /// # Ok(())
43    /// # }
44    /// ```
45    pub async fn delete_folder<'a>(
46        &self,
47        identifier: impl Into<FolderIdentifier<'a>>,
48    ) -> crate::Result<Folder> {
49        self.get_request::<FolderResponse, _>("deletefolder", identifier.into())
50            .await
51            .map(|res| res.metadata)
52    }
53}
54
55impl crate::Client {
56    /// Recursively deletes a folder and all of its contents from pCloud.
57    ///
58    /// This function calls the `deletefolderrecursive` API endpoint and removes
59    /// the folder and everything inside it (including subfolders and files).
60    ///
61    /// # Arguments
62    ///
63    /// * `identifier` - A value that can be converted into a [`FolderIdentifier`] (e.g., folder ID or path).
64    ///
65    /// # Returns
66    ///
67    /// A [`RecursivePayload`] struct containing statistics about how many files and folders were deleted.
68    ///
69    /// # Errors
70    ///
71    /// Returns a [`crate::Error`] if the folder does not exist or the API call fails.
72    ///
73    /// # Examples
74    ///
75    /// ```rust,no_run
76    /// # async fn example(client: &pcloud::Client) -> Result<(), pcloud::Error> {
77    /// let result = client.delete_folder_recursive(12345u64).await?;
78    /// println!(
79    ///     "Deleted {} files and {} folders",
80    ///     result.deleted_files,
81    ///     result.deleted_folders
82    /// );
83    /// # Ok(())
84    /// # }
85    /// ```
86    pub async fn delete_folder_recursive<'a>(
87        &self,
88        identifier: impl Into<FolderIdentifier<'a>>,
89    ) -> crate::Result<RecursivePayload> {
90        self.get_request("deletefolderrecursive", identifier.into())
91            .await
92    }
93}
94
95#[cfg(test)]
96mod http_tests {
97    use crate::{Client, Credentials};
98    use mockito::Matcher;
99
100    #[tokio::test]
101    async fn success() {
102        let mut server = mockito::Server::new_async().await;
103        let m = server
104            .mock("GET", "/deletefolder")
105            .match_query(Matcher::AllOf(vec![
106                Matcher::UrlEncoded("access_token".into(), "access-token".into()),
107                Matcher::UrlEncoded("folderid".into(), "42".into()),
108            ]))
109            .with_status(200)
110            .with_body(
111                r#"{
112    "result": 0,
113    "metadata": {
114        "path": "\/testing",
115        "name": "testing",
116        "created": "Fri, 23 Jul 2021 19:39:09 +0000",
117        "ismine": true,
118        "thumb": false,
119        "modified": "Fri, 23 Jul 2021 19:39:09 +0000",
120        "id": "d10",
121        "isshared": false,
122        "icon": "folder",
123        "isfolder": true,
124        "parentfolderid": 0,
125        "folderid": 10
126    }
127}"#,
128            )
129            .create();
130        let client = Client::new(server.url(), Credentials::access_token("access-token")).unwrap();
131        let result = client.delete_folder(42).await.unwrap();
132        assert_eq!(result.base.name, "testing");
133        m.assert();
134    }
135}