1use serde::{Deserialize, Deserializer, Serialize};
3use serde_json::Number;
4use std::collections::BTreeMap;
5fn required_nullable<'de, D: Deserializer<'de>, T: Deserialize<'de>>(
6 d: D,
7) -> Result<Option<T>, D::Error> {
8 Option::deserialize(d)
9}
10#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
12#[serde(
13 deny_unknown_fields,
14 rename_all(deserialize = "camelCase", serialize = "snake_case")
15)]
16pub struct ScrumSettings {
17 pub enabled: Option<bool>,
18 pub product_goal: Option<String>,
19 pub definition_of_done: Option<String>,
20 pub estimate_source: Option<String>,
21 pub estimate_custom_field_id: Option<String>,
22 pub estimate_unit: Option<String>,
23 pub completion_policy: Option<String>,
24 pub product_owner_id: Option<String>,
25 pub scrum_master_id: Option<String>,
26 pub developer_ids: Option<Vec<String>>,
27 pub working_days: Option<Vec<u8>>,
28 pub visibility: Option<ScrumVisibility>,
29}
30#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
32#[serde(
33 deny_unknown_fields,
34 rename_all(deserialize = "camelCase", serialize = "snake_case")
35)]
36pub struct ScrumVisibility {
37 pub card_sprint: Option<bool>,
38 pub card_past_sprints: Option<bool>,
39 pub card_release: Option<bool>,
40 pub card_issue_type: Option<bool>,
41 pub card_acceptance_criteria: Option<bool>,
42 pub card_backlog_rank: Option<bool>,
43 pub minicard_sprint: Option<bool>,
44 pub minicard_past_sprints: Option<bool>,
45 pub minicard_release: Option<bool>,
46 pub minicard_issue_type: Option<bool>,
47 pub minicard_acceptance_criteria: Option<bool>,
48 pub minicard_backlog_rank: Option<bool>,
49 pub list_category: Option<bool>,
50 pub swimlane_sprint: Option<bool>,
51 pub swimlane_release: Option<bool>,
52 pub swimlane_purpose: Option<bool>,
53}
54#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
56#[serde(
57 deny_unknown_fields,
58 rename_all(deserialize = "camelCase", serialize = "snake_case")
59)]
60pub struct ScrumCard {
61 pub sprint_id: Option<String>,
62 pub past_sprint_ids: Option<Vec<String>>,
63 pub backlog_rank: Option<Number>,
64 pub release_id: Option<String>,
65 pub release_ids: Option<Vec<String>>,
66 pub issue_type: Option<String>,
67 pub acceptance_criteria: Option<String>,
68}
69#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
71#[serde(
72 deny_unknown_fields,
73 rename_all(deserialize = "camelCase", serialize = "snake_case")
74)]
75pub struct ScrumList {
76 pub category: Option<String>,
77}
78#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
80#[serde(
81 deny_unknown_fields,
82 rename_all(deserialize = "camelCase", serialize = "snake_case")
83)]
84pub struct ScrumSwimlane {
85 pub sprint_id: Option<String>,
86 pub release_id: Option<String>,
87 pub purpose: Option<String>,
88}
89#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
91#[serde(
92 deny_unknown_fields,
93 rename_all(deserialize = "camelCase", serialize = "snake_case")
94)]
95pub struct ScrumImportLoss {
96 pub path: String,
97 pub source_id: String,
98 pub reason: String,
99}
100#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
102#[serde(
103 deny_unknown_fields,
104 rename_all(deserialize = "camelCase", serialize = "snake_case")
105)]
106pub struct BoardAnnouncement {
107 pub enabled: Option<bool>,
108 pub body: Option<String>,
109 pub updated_at: Option<String>,
110}
111#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
113#[serde(
114 deny_unknown_fields,
115 rename_all(deserialize = "camelCase", serialize = "snake_case")
116)]
117pub struct BoardWipGroup {
118 #[serde(rename(deserialize = "_id", serialize = "id"))]
119 pub id: String,
120 pub name: Option<String>,
121 pub list_ids: Vec<String>,
122 pub limit: Number,
123 pub enabled: bool,
124}
125#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
127#[serde(
128 deny_unknown_fields,
129 rename_all(deserialize = "camelCase", serialize = "snake_case")
130)]
131pub struct BoardColumnSet {
132 #[serde(rename(deserialize = "_id", serialize = "id"))]
133 pub id: String,
134 pub name: String,
135 pub columns: Vec<BoardColumn>,
136}
137#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
139#[serde(
140 deny_unknown_fields,
141 rename_all(deserialize = "camelCase", serialize = "snake_case")
142)]
143pub struct BoardColumn {
144 #[serde(rename(deserialize = "_id", serialize = "id"))]
145 pub id: String,
146 pub title: String,
147 pub color: String,
148}
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
151#[serde(
152 deny_unknown_fields,
153 rename_all(deserialize = "camelCase", serialize = "snake_case")
154)]
155pub struct EmailParts {
156 pub description: Option<String>,
157 pub strip_quoted: Option<bool>,
158 pub attachments: Option<bool>,
159 pub sender_line: Option<bool>,
160}
161#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
163#[serde(
164 deny_unknown_fields,
165 rename_all(deserialize = "camelCase", serialize = "snake_case")
166)]
167pub struct BoardEmailToCard {
168 pub enabled: Option<bool>,
169 pub list_id: Option<String>,
170 pub swimlane_id: Option<String>,
171 pub parts: Option<EmailParts>,
172}
173#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175#[serde(
176 deny_unknown_fields,
177 rename_all(deserialize = "camelCase", serialize = "snake_case")
178)]
179pub struct MemberEmailToCard {
180 pub enabled: Option<bool>,
181 pub parts: Option<EmailParts>,
182}
183#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
185#[serde(
186 deny_unknown_fields,
187 rename_all(deserialize = "camelCase", serialize = "snake_case")
188)]
189pub struct NotificationDelivery {
190 pub email: Option<NotificationChannel>,
191 pub tray: Option<NotificationChannel>,
192 pub webhook: Option<WebhookDelivery>,
193}
194#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
196#[serde(
197 deny_unknown_fields,
198 rename_all(deserialize = "camelCase", serialize = "snake_case")
199)]
200pub struct MemberNotificationDelivery {
201 pub email: Option<NotificationChannel>,
202 pub tray: Option<NotificationChannel>,
203}
204#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
206#[serde(
207 deny_unknown_fields,
208 rename_all(deserialize = "camelCase", serialize = "snake_case")
209)]
210pub struct NotificationChannel {
211 pub layout: Option<String>,
212 pub parts: Option<Vec<String>>,
213 pub grouping: Option<String>,
214 pub schedule: Option<String>,
215 pub interval_minutes: Option<Number>,
216 pub daily_time: Option<String>,
217 pub quiet_start: Option<String>,
218 pub quiet_end: Option<String>,
219 pub timezone: Option<String>,
220}
221#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
223#[serde(
224 deny_unknown_fields,
225 rename_all(deserialize = "camelCase", serialize = "snake_case")
226)]
227pub struct WebhookDelivery {
228 pub text: Option<bool>,
229 pub fields: Option<Vec<String>>,
230 pub grouping: Option<String>,
231 pub schedule: Option<String>,
232 pub interval_minutes: Option<Number>,
233 pub daily_time: Option<String>,
234 pub quiet_start: Option<String>,
235 pub quiet_end: Option<String>,
236 pub timezone: Option<String>,
237}
238#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
240#[serde(
241 deny_unknown_fields,
242 rename_all(deserialize = "camelCase", serialize = "snake_case")
243)]
244pub struct ChatViewLayout {
245 pub tree_width: Number,
246 pub chat_width: Number,
247 pub tree_collapsed: bool,
248 pub card_collapsed: bool,
249 pub chat_collapsed: bool,
250}
251#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
253#[serde(
254 deny_unknown_fields,
255 rename_all(deserialize = "camelCase", serialize = "snake_case")
256)]
257pub struct PersonalDependency {
258 pub board_id: String,
259 pub card_id: String,
260 pub target_card_id: String,
261 pub r#type: String,
262 pub color: Option<String>,
263 pub icon: Option<String>,
264}
265#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
267#[serde(
268 deny_unknown_fields,
269 rename_all(deserialize = "camelCase", serialize = "snake_case")
270)]
271pub struct CardCustomFieldLink {
272 pub card_id: String,
273 pub mode: String,
274 pub user_id: String,
275 pub created_at: Option<String>,
276}
277#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
279#[serde(
280 deny_unknown_fields,
281 rename_all(deserialize = "camelCase", serialize = "snake_case")
282)]
283pub struct CardEmail {
284 pub direction: String,
285 #[serde(rename(deserialize = "from", serialize = "sender"))]
286 #[serde(deserialize_with = "required_nullable")]
287 pub sender: Option<EmailSender>,
288 pub to: Vec<String>,
289 pub cc: Vec<String>,
290 pub subject: String,
291 #[serde(deserialize_with = "required_nullable")]
292 pub message_id: Option<String>,
293 pub thread_ids: Vec<String>,
294 pub at: String,
295}
296#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
298#[serde(
299 deny_unknown_fields,
300 rename_all(deserialize = "camelCase", serialize = "snake_case")
301)]
302pub struct EmailSender {
303 pub name: String,
304 pub address: String,
305}
306#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
308#[serde(
309 deny_unknown_fields,
310 rename_all(deserialize = "camelCase", serialize = "snake_case")
311)]
312pub struct CardDrawing {
313 #[serde(rename(deserialize = "_id", serialize = "id"))]
314 pub id: String,
315 pub strokes: Vec<DrawingStroke>,
316 pub width: Number,
317 pub height: Number,
318 pub png_attachment_id: Option<String>,
319 pub updated_at: Option<String>,
320}
321#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
323#[serde(
324 deny_unknown_fields,
325 rename_all(deserialize = "camelCase", serialize = "snake_case")
326)]
327pub struct DrawingStroke {
328 #[serde(rename(deserialize = "_id", serialize = "id"))]
329 pub id: Option<String>,
330 pub user_id: Option<String>,
331 pub color: String,
332 pub width: Number,
333 pub points: Vec<[Number; 2]>,
334}
335#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337#[serde(
338 deny_unknown_fields,
339 rename_all(deserialize = "camelCase", serialize = "snake_case")
340)]
341pub struct ListRoleException {
342 pub write: Option<bool>,
343 pub comment: Option<bool>,
344}
345#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
347#[serde(
348 deny_unknown_fields,
349 rename_all(deserialize = "camelCase", serialize = "snake_case")
350)]
351pub struct ListSyncSource {
352 pub r#type: Option<String>,
353 pub url: Option<String>,
354 pub project_key: Option<String>,
355 pub time_mapping_identities: Option<BTreeMap<String, String>>,
356 pub estimate_custom_field_id: Option<String>,
357 pub estimate_mapping_identity: Option<String>,
358 pub estimate_source_field: Option<String>,
359 pub fields: Option<Vec<String>>,
360 pub create_cards: Option<bool>,
361 pub archive_cards: Option<bool>,
362 pub issue_details: Option<bool>,
363 pub write_back: Option<bool>,
364 pub write_back_since: Option<String>,
365 pub enabled: Option<bool>,
366 pub last_synced_at: Option<String>,
367 pub last_sync_error: Option<String>,
368}
369#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371#[serde(
372 deny_unknown_fields,
373 rename_all(deserialize = "camelCase", serialize = "snake_case")
374)]
375pub struct CardSyncLastSource {
376 pub title: Option<String>,
377 pub description: Option<String>,
378 pub estimate: Option<Number>,
379 pub original_estimate: Option<Number>,
380 pub remaining_estimate: Option<Number>,
381 pub original_estimate_mapping: Option<String>,
382 pub remaining_estimate_mapping: Option<String>,
383 pub estimate_mapping: Option<String>,
384 pub spent_time: Option<Number>,
385 pub sprint: Option<String>,
386 pub releases: Option<Vec<String>>,
387}