wekan-cli 2.0.0

Agent-first, human-friendly command-line client for Wekan
Documentation
use super::{ClientError, WekanClient};
use crate::client::imports::PreparedImportRequest;
use crate::client::transport::decode_success;
use reqwest::header::{ACCEPT, CONTENT_TYPE};
use secrecy::{ExposeSecret, SecretString};
use serde::{Deserialize, Serialize};
use std::time::Duration;

#[derive(Serialize)]
pub struct IcsImportRequest {
    pub ics: String,
}

#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct IcsImportResponse {
    pub created: u64,
    pub card_ids: Vec<String>,
}

impl WekanClient {
    pub async fn import_ics(
        &self,
        board_id: &str,
        swimlane_id: &str,
        list_id: &str,
        request: PreparedImportRequest<IcsImportRequest>,
        token: &SecretString,
        timeout: Option<Duration>,
    ) -> Result<IcsImportResponse, ClientError> {
        let mut url = self.board_endpoint(board_id, None)?;
        url.path_segments_mut()
            .expect("board endpoint is a base URL")
            .extend(["swimlanes", swimlane_id, "lists", list_id, "ics"]);
        let mut request = self
            .http
            .post(url)
            .header(ACCEPT, "application/json")
            .header(CONTENT_TYPE, "application/json")
            .bearer_auth(token.expose_secret())
            .body(request.into_body());
        if let Some(timeout) = timeout {
            request = request.timeout(timeout);
        }
        let body = self.execute_success_request(request).await?;
        decode_success(&body, "ICS import", true)
    }
}