eagle_api/api/folder/
update.rs1use serde::{Deserialize, Serialize};
2use typed_builder::TypedBuilder;
3
4use crate::{
5 data::{FolderColor, FolderId},
6 EagleApi, EagleResponse, Result,
7};
8
9#[derive(Debug, Serialize, TypedBuilder)]
10#[serde(rename_all = "camelCase")]
11pub struct FolderUpdateRequest {
12 #[builder(setter(into))]
13 folder_id: FolderId,
14 #[builder(default, setter(strip_option))]
15 #[serde(skip_serializing_if = "Option::is_none")]
16 new_name: Option<String>,
17 #[builder(default, setter(strip_option))]
18 #[serde(skip_serializing_if = "Option::is_none")]
19 new_description: Option<String>,
20 #[builder(default, setter(strip_option))]
21 #[serde(skip_serializing_if = "Option::is_none")]
22 new_color: Option<FolderColor>,
23}
24
25#[derive(Debug, Deserialize)]
26#[serde(rename_all = "camelCase")]
27struct FolderUpdateResponse {
28 id: FolderId,
29}
30
31impl EagleApi {
32 pub async fn folder_update(&self, request: FolderUpdateRequest) -> Result<FolderId> {
33 let url = format!("{}/api/folder/update", self.inner.host);
34
35 let resp: EagleResponse<FolderUpdateResponse> = self
36 .inner
37 .client
38 .post(&url)
39 .json(&request)
40 .send()
41 .await?
42 .json()
43 .await?;
44
45 Ok(resp.ok()?.id)
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use std::env::var;
52
53 use super::*;
54
55 #[tokio::test]
56 #[ignore]
57 async fn test_folder_updates() {
58 let api = EagleApi::new(&var("EAGLE_API_TEST_HOST").unwrap());
59 let folders = api.folder_list().await.unwrap();
60 let resp = api
61 .folder_update(
62 FolderUpdateRequest::builder()
63 .folder_id(folders[0].id.clone())
64 .new_color(FolderColor::Red)
65 .build(),
66 )
67 .await;
68 resp.unwrap();
69 }
70}