openlark_workflow/v2/task/
models.rs1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Clone, Serialize, Default)]
8pub struct CreateTaskBody {
9 pub summary: String,
11
12 #[serde(skip_serializing_if = "Option::is_none")]
14 pub description: Option<String>,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub start: Option<String>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub due: Option<String>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub tasklist_guid: Option<String>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub section_guid: Option<String>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub priority: Option<i32>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub custom_fields: Option<Value>,
39
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub followers: Option<Vec<String>>,
43
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub subtasks: Option<Vec<Value>>,
47
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub assignee: Option<String>,
51
52 #[serde(skip_serializing_if = "Option::is_none")]
54 pub remind_time: Option<String>,
55
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub repeat_rule: Option<Value>,
59}
60
61#[derive(Debug, Clone, Serialize, Default)]
63pub struct UpdateTaskBody {
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub summary: Option<String>,
67
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub description: Option<String>,
71
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub start: Option<String>,
75
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub due: Option<String>,
79
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub priority: Option<i32>,
83
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub custom_fields: Option<Value>,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub followers: Option<Vec<String>>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub subtasks: Option<Vec<Value>>,
95
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub assignee: Option<String>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub remind_time: Option<String>,
103
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub repeat_rule: Option<Value>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub status: Option<String>,
111}
112
113#[derive(Debug, Clone, Deserialize)]
115pub struct CreateTaskResponse {
116 pub task_guid: String,
118
119 pub summary: String,
121
122 #[serde(default)]
124 pub description: Option<String>,
125
126 pub status: String,
128
129 #[serde(default)]
131 pub tasklist_guid: Option<String>,
132
133 #[serde(default)]
135 pub section_guid: Option<String>,
136
137 pub created_at: String,
139
140 pub updated_at: String,
142}
143
144#[derive(Debug, Clone, Deserialize)]
146pub struct GetTaskResponse {
147 pub task_guid: String,
149
150 pub summary: String,
152
153 #[serde(default)]
155 pub description: Option<String>,
156
157 pub status: String,
159
160 #[serde(default)]
162 pub tasklist_guid: Option<String>,
163
164 #[serde(default)]
166 pub section_guid: Option<String>,
167
168 #[serde(default)]
170 pub priority: Option<i32>,
171
172 #[serde(default)]
174 pub start: Option<String>,
175
176 #[serde(default)]
178 pub due: Option<String>,
179
180 pub created_at: String,
182
183 pub updated_at: String,
185
186 #[serde(default)]
188 pub completed_at: Option<String>,
189}
190
191#[derive(Debug, Clone, Deserialize)]
193pub struct UpdateTaskResponse {
194 pub task_guid: String,
196
197 pub summary: String,
199
200 #[serde(default)]
202 pub description: Option<String>,
203
204 pub status: String,
206
207 pub updated_at: String,
209}
210
211#[derive(Debug, Clone, Deserialize)]
213pub struct DeleteTaskResponse {
214 pub success: bool,
216
217 pub task_guid: String,
219}
220
221#[derive(Debug, Clone, Deserialize)]
223pub struct CompleteTaskResponse {
224 pub task_guid: String,
226
227 pub status: String,
229
230 pub completed_at: String,
232}
233
234#[derive(Debug, Clone, Deserialize)]
236pub struct UncompleteTaskResponse {
237 pub task_guid: String,
239
240 pub status: String,
242
243 pub updated_at: String,
245}
246
247#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
249pub struct TaskItem {
250 pub task_guid: String,
252
253 pub summary: String,
255
256 #[serde(default)]
258 pub description: Option<String>,
259
260 pub status: String,
262
263 #[serde(default)]
265 pub tasklist_guid: Option<String>,
266
267 #[serde(default)]
269 pub section_guid: Option<String>,
270
271 #[serde(default)]
273 pub priority: Option<i32>,
274
275 #[serde(default)]
277 pub start: Option<String>,
278
279 #[serde(default)]
281 pub due: Option<String>,
282
283 pub created_at: String,
285
286 pub updated_at: String,
288
289 #[serde(default)]
291 pub completed_at: Option<String>,
292
293 #[serde(default)]
295 pub assignee: Option<String>,
296
297 #[serde(default)]
299 pub creator: Option<String>,
300}
301
302#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
304pub struct ListTasksResponse {
305 #[serde(default)]
307 pub has_more: bool,
308
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub page_token: Option<String>,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub total: Option<i32>,
316
317 #[serde(default)]
319 pub items: Vec<TaskItem>,
320}
321
322#[cfg(test)]
323#[allow(unused_imports)]
324mod tests {
325
326 #[test]
327 fn test_serialization_roundtrip() {
328 let json = r#"{"test": "value"}"#;
330 assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
331 }
332
333 #[test]
334 fn test_deserialization_from_json() {
335 let json = r#"{"field": "data"}"#;
337 let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
338 assert_eq!(value["field"], "data");
339 }
340}