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}