wekan_cli/client/lists/
transfer.rs1use super::{ClientError, IdResponse, WekanClient, require_non_empty};
2use crate::client::transport::decode_success;
3use reqwest::header::ACCEPT;
4use secrecy::{ExposeSecret, SecretString};
5use serde::Serialize;
6use serde_json::Value;
7
8#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
9pub struct TransferListRequest {
10 #[serde(rename = "toBoardId", skip_serializing_if = "Option::is_none")]
11 pub target_board_id: Option<String>,
12 #[serde(rename = "toSwimlaneId", skip_serializing_if = "Option::is_none")]
13 pub target_swimlane_id: Option<String>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub position: Option<Value>,
16}
17impl WekanClient {
18 pub async fn copy_list(
19 &self,
20 board_id: &str,
21 list_id: &str,
22 request: &TransferListRequest,
23 token: &SecretString,
24 ) -> Result<String, ClientError> {
25 self.transfer_list(board_id, list_id, request, token, "copy")
26 .await
27 }
28 pub async fn move_list(
29 &self,
30 board_id: &str,
31 list_id: &str,
32 request: &TransferListRequest,
33 token: &SecretString,
34 ) -> Result<String, ClientError> {
35 self.transfer_list(board_id, list_id, request, token, "move")
36 .await
37 }
38 async fn transfer_list(
39 &self,
40 board_id: &str,
41 list_id: &str,
42 request: &TransferListRequest,
43 token: &SecretString,
44 action: &str,
45 ) -> Result<String, ClientError> {
46 let mut endpoint = self.list_endpoint(board_id, Some(list_id))?;
47 endpoint
48 .path_segments_mut()
49 .expect("HTTP endpoint")
50 .push(action);
51 let body = self
52 .execute_success_request(
53 self.http
54 .post(endpoint)
55 .header(ACCEPT, "application/json")
56 .bearer_auth(token.expose_secret())
57 .json(request),
58 )
59 .await?;
60 let response: IdResponse = decode_success(&body, "list transfer", true)?;
61 require_non_empty(&response.id, "list transfer", "list id")?;
62 Ok(response.id)
63 }
64}