eagle_api/api/folder/
update.rs

1use 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}