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