open_lark/service/cloud_docs/wiki/v2/task/
get.rs1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 core::{
6 api_req::ApiRequest,
7 api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8 config::Config,
9 constants::AccessTokenType,
10 endpoints::{cloud_docs::*, EndpointBuilder},
11 http::Transport,
12 req_option::RequestOption,
13 SDKResult,
14 },
15 impl_executable_builder_owned,
16};
17
18#[derive(Debug, Serialize, Default)]
20pub struct GetTaskRequest {
21 #[serde(skip)]
22 api_request: ApiRequest,
23 #[serde(skip)]
25 task_id: String,
26}
27
28impl GetTaskRequest {
29 pub fn builder() -> GetTaskRequestBuilder {
30 GetTaskRequestBuilder::default()
31 }
32
33 pub fn new(task_id: impl ToString) -> Self {
34 Self {
35 task_id: task_id.to_string(),
36 ..Default::default()
37 }
38 }
39}
40
41#[derive(Default)]
42pub struct GetTaskRequestBuilder {
43 request: GetTaskRequest,
44}
45
46impl GetTaskRequestBuilder {
47 pub fn task_id(mut self, task_id: impl ToString) -> Self {
49 self.request.task_id = task_id.to_string();
50 self
51 }
52
53 pub fn build(mut self) -> GetTaskRequest {
54 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
55 self.request
56 }
57}
58
59impl_executable_builder_owned!(
60 GetTaskRequestBuilder,
61 crate::service::cloud_docs::wiki::v2::task::TaskService,
62 GetTaskRequest,
63 GetTaskResponse,
64 get
65);
66
67#[derive(Debug, Deserialize)]
69#[serde(rename_all = "snake_case")]
70pub enum TaskStatus {
71 Processing,
73 Success,
75 Failed,
77}
78
79#[derive(Debug, Deserialize)]
81pub struct MoveResult {
82 pub obj_token: String,
84 pub node_token: String,
86 pub title: Option<String>,
88 pub obj_type: Option<String>,
90}
91
92#[derive(Debug, Deserialize)]
94pub struct TaskDetail {
95 pub task_id: String,
97 pub status: TaskStatus,
99 pub space_id: Option<String>,
101 pub processed_count: Option<i32>,
103 pub total_count: Option<i32>,
105 pub move_results: Option<Vec<MoveResult>>,
107 pub error_message: Option<String>,
109 pub create_time: Option<String>,
111 pub finish_time: Option<String>,
113}
114
115#[derive(Debug, Deserialize)]
117pub struct GetTaskResponse {
118 pub task: TaskDetail,
120}
121
122impl ApiResponseTrait for GetTaskResponse {
123 fn data_format() -> ResponseFormat {
124 ResponseFormat::Data
125 }
126}
127
128pub async fn get_task(
130 request: GetTaskRequest,
131 config: &Config,
132 option: Option<RequestOption>,
133) -> SDKResult<BaseResponse<GetTaskResponse>> {
134 let mut api_req = request.api_request;
135 api_req.http_method = Method::GET;
136 api_req.api_path =
137 EndpointBuilder::replace_param(WIKI_V2_TASK_GET, "task_id", &request.task_id);
138 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
139
140 let api_resp = Transport::request(api_req, config, option).await?;
141 Ok(api_resp)
142}
143
144impl TaskStatus {
145 pub fn is_finished(&self) -> bool {
147 matches!(self, TaskStatus::Success | TaskStatus::Failed)
148 }
149
150 pub fn is_success(&self) -> bool {
152 matches!(self, TaskStatus::Success)
153 }
154
155 pub fn is_failed(&self) -> bool {
157 matches!(self, TaskStatus::Failed)
158 }
159
160 pub fn is_processing(&self) -> bool {
162 matches!(self, TaskStatus::Processing)
163 }
164}
165
166impl TaskDetail {
167 pub fn progress_percentage(&self) -> Option<f32> {
169 if let (Some(processed), Some(total)) = (self.processed_count, self.total_count) {
170 if total > 0 {
171 return Some((processed as f32 / total as f32) * 100.0);
172 }
173 }
174 None
175 }
176
177 pub fn has_error(&self) -> bool {
179 self.error_message.is_some()
180 }
181
182 pub fn success_count(&self) -> usize {
184 self.move_results
185 .as_ref()
186 .map_or(0, |results| results.len())
187 }
188}
189
190#[cfg(test)]
191#[allow(unused_variables, unused_unsafe)]
192mod tests {
193 use super::*;
194
195 #[test]
196 fn test_get_task_request_builder() {
197 let request = GetTaskRequest::builder().task_id("taskxxxxxx").build();
198
199 assert_eq!(request.task_id, "taskxxxxxx");
200 }
201
202 #[test]
203 fn test_task_status_methods() {
204 assert!(TaskStatus::Success.is_finished());
205 assert!(TaskStatus::Failed.is_finished());
206 assert!(!TaskStatus::Processing.is_finished());
207
208 assert!(TaskStatus::Success.is_success());
209 assert!(!TaskStatus::Failed.is_success());
210
211 assert!(TaskStatus::Failed.is_failed());
212 assert!(!TaskStatus::Success.is_failed());
213
214 assert!(TaskStatus::Processing.is_processing());
215 assert!(!TaskStatus::Success.is_processing());
216 }
217}