openlark_workflow/v2/tasklist/
models.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Default)]
7pub struct CreateTasklistBody {
8 pub summary: String,
10
11 #[serde(skip_serializing_if = "Option::is_none")]
13 pub description: Option<String>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
17 pub icon: Option<TasklistIcon>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
22#[serde(tag = "type")]
23pub enum TasklistIcon {
24 #[serde(rename = "default")]
26 Default {
27 index: i32,
29 },
30 #[serde(rename = "emoji")]
32 Emoji {
33 emoji: String,
35 },
36 #[serde(rename = "image")]
38 Image {
39 image_key: String,
41 },
42}
43
44#[derive(Debug, Clone, Serialize, Default)]
46pub struct UpdateTasklistBody {
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub summary: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub description: Option<String>,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub icon: Option<TasklistIcon>,
58}
59
60#[derive(Debug, Clone, Deserialize)]
62pub struct CreateTasklistResponse {
63 pub tasklist_guid: String,
65
66 pub summary: String,
68
69 #[serde(default)]
71 pub description: Option<String>,
72
73 #[serde(default)]
75 pub icon: Option<TasklistIcon>,
76
77 pub created_at: String,
79
80 pub updated_at: String,
82}
83
84#[derive(Debug, Clone, Deserialize)]
86pub struct GetTasklistResponse {
87 pub tasklist_guid: String,
89
90 pub summary: String,
92
93 #[serde(default)]
95 pub description: Option<String>,
96
97 #[serde(default)]
99 pub icon: Option<TasklistIcon>,
100
101 pub created_at: String,
103
104 pub updated_at: String,
106}
107
108#[derive(Debug, Clone, Deserialize)]
110pub struct UpdateTasklistResponse {
111 pub tasklist_guid: String,
113
114 pub summary: String,
116
117 #[serde(default)]
119 pub description: Option<String>,
120
121 #[serde(default)]
123 pub icon: Option<TasklistIcon>,
124
125 pub updated_at: String,
127}
128
129#[derive(Debug, Clone, Deserialize)]
131pub struct DeleteTasklistResponse {
132 pub success: bool,
134
135 pub tasklist_guid: String,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
141pub struct TasklistItem {
142 pub tasklist_guid: String,
144
145 pub summary: String,
147
148 #[serde(default)]
150 pub description: Option<String>,
151
152 #[serde(default)]
154 pub icon: Option<TasklistIcon>,
155
156 pub created_at: String,
158
159 pub updated_at: String,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
165pub struct ListTasklistsResponse {
166 #[serde(default)]
168 pub has_more: bool,
169
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub page_token: Option<String>,
173
174 #[serde(skip_serializing_if = "Option::is_none")]
176 pub total: Option<i32>,
177
178 #[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 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 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}