Skip to main content

openlark_workflow/v2/tasklist/
models.rs

1//! 任务清单 API v2 的数据模型
2
3use serde::{Deserialize, Serialize};
4
5/// 创建任务清单请求体
6#[derive(Debug, Clone, Serialize, Default)]
7pub struct CreateTasklistBody {
8    /// 任务清单标题
9    pub summary: String,
10
11    /// 任务清单描述
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub description: Option<String>,
14
15    /// 任务清单图标
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub icon: Option<TasklistIcon>,
18}
19
20/// 任务清单图标
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
22#[serde(tag = "type")]
23pub enum TasklistIcon {
24    #[serde(rename = "default")]
25    Default { index: i32 },
26    #[serde(rename = "emoji")]
27    Emoji { emoji: String },
28    #[serde(rename = "image")]
29    Image { image_key: String },
30}
31
32/// 更新任务清单请求体
33#[derive(Debug, Clone, Serialize, Default)]
34pub struct UpdateTasklistBody {
35    /// 任务清单标题
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub summary: Option<String>,
38
39    /// 任务清单描述
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub description: Option<String>,
42
43    /// 任务清单图标
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub icon: Option<TasklistIcon>,
46}
47
48/// 创建任务清单响应
49#[derive(Debug, Clone, Deserialize)]
50pub struct CreateTasklistResponse {
51    /// 任务清单 GUID
52    pub tasklist_guid: String,
53
54    /// 任务清单标题
55    pub summary: String,
56
57    /// 任务清单描述
58    #[serde(default)]
59    pub description: Option<String>,
60
61    /// 任务清单图标
62    #[serde(default)]
63    pub icon: Option<TasklistIcon>,
64
65    /// 创建时间
66    pub created_at: String,
67
68    /// 更新时间
69    pub updated_at: String,
70}
71
72/// 获取任务清单响应
73#[derive(Debug, Clone, Deserialize)]
74pub struct GetTasklistResponse {
75    /// 任务清单 GUID
76    pub tasklist_guid: String,
77
78    /// 任务清单标题
79    pub summary: String,
80
81    /// 任务清单描述
82    #[serde(default)]
83    pub description: Option<String>,
84
85    /// 任务清单图标
86    #[serde(default)]
87    pub icon: Option<TasklistIcon>,
88
89    /// 创建时间
90    pub created_at: String,
91
92    /// 更新时间
93    pub updated_at: String,
94}
95
96/// 更新任务清单响应
97#[derive(Debug, Clone, Deserialize)]
98pub struct UpdateTasklistResponse {
99    /// 任务清单 GUID
100    pub tasklist_guid: String,
101
102    /// 任务清单标题
103    pub summary: String,
104
105    /// 任务清单描述
106    #[serde(default)]
107    pub description: Option<String>,
108
109    /// 任务清单图标
110    #[serde(default)]
111    pub icon: Option<TasklistIcon>,
112
113    /// 更新时间
114    pub updated_at: String,
115}
116
117/// 删除任务清单响应
118#[derive(Debug, Clone, Deserialize)]
119pub struct DeleteTasklistResponse {
120    /// 是否删除成功
121    pub success: bool,
122
123    /// 任务清单 GUID
124    pub tasklist_guid: String,
125}
126
127/// 任务清单列表项
128#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
129pub struct TasklistItem {
130    /// 任务清单 GUID
131    pub tasklist_guid: String,
132
133    /// 任务清单标题
134    pub summary: String,
135
136    /// 任务清单描述
137    #[serde(default)]
138    pub description: Option<String>,
139
140    /// 任务清单图标
141    #[serde(default)]
142    pub icon: Option<TasklistIcon>,
143
144    /// 创建时间
145    pub created_at: String,
146
147    /// 更新时间
148    pub updated_at: String,
149}
150
151/// 获取任务清单列表响应
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
153pub struct ListTasklistsResponse {
154    /// 是否还有更多项
155    #[serde(default)]
156    pub has_more: bool,
157
158    /// 分页标记
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub page_token: Option<String>,
161
162    /// 总数
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub total: Option<i32>,
165
166    /// 列表项
167    #[serde(default)]
168    pub items: Vec<TasklistItem>,
169}
170
171#[cfg(test)]
172#[allow(unused_imports)]
173mod tests {
174
175    #[test]
176    fn test_serialization_roundtrip() {
177        // 基础序列化测试
178        let json = r#"{"test": "value"}"#;
179        assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
180    }
181
182    #[test]
183    fn test_deserialization_from_json() {
184        // 基础反序列化测试
185        let json = r#"{"field": "data"}"#;
186        let value: serde_json::Value = serde_json::from_str(json).unwrap();
187        assert_eq!(value["field"], "data");
188    }
189}