Skip to main content

wekan_cli/client/cards/
import.rs

1use super::{ClientError, WekanClient};
2use crate::client::imports::PreparedImportRequest;
3use crate::client::transport::decode_success;
4use reqwest::header::{ACCEPT, CONTENT_TYPE};
5use secrecy::{ExposeSecret, SecretString};
6use serde::{Deserialize, Serialize};
7use std::time::Duration;
8
9#[derive(Serialize)]
10pub struct IcsImportRequest {
11    pub ics: String,
12}
13
14#[derive(Debug, Deserialize)]
15#[serde(deny_unknown_fields, rename_all = "camelCase")]
16pub struct IcsImportResponse {
17    pub created: u64,
18    pub card_ids: Vec<String>,
19}
20
21impl WekanClient {
22    pub async fn import_ics(
23        &self,
24        board_id: &str,
25        swimlane_id: &str,
26        list_id: &str,
27        request: PreparedImportRequest<IcsImportRequest>,
28        token: &SecretString,
29        timeout: Option<Duration>,
30    ) -> Result<IcsImportResponse, ClientError> {
31        let mut url = self.board_endpoint(board_id, None)?;
32        url.path_segments_mut()
33            .expect("board endpoint is a base URL")
34            .extend(["swimlanes", swimlane_id, "lists", list_id, "ics"]);
35        let mut request = self
36            .http
37            .post(url)
38            .header(ACCEPT, "application/json")
39            .header(CONTENT_TYPE, "application/json")
40            .bearer_auth(token.expose_secret())
41            .body(request.into_body());
42        if let Some(timeout) = timeout {
43            request = request.timeout(timeout);
44        }
45        let body = self.execute_success_request(request).await?;
46        decode_success(&body, "ICS import", true)
47    }
48}