1use super::{present_nullable, validate_response_date};
3use serde::{Deserialize, Serialize};
4
5fn present_nullable_date<'de, D: serde::Deserializer<'de>>(
6 d: D,
7) -> Result<Option<Option<String>>, D::Error> {
8 let value = present_nullable::<D, String>(d)?;
9 if let Some(Some(date)) = &value {
10 validate_response_date(date).map_err(|()| {
11 serde::de::Error::custom("expected a valid Wekan date-time string or null")
12 })?;
13 }
14 Ok(value)
15}
16
17#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
19#[serde(untagged)]
20pub enum RuleNumber {
21 Number(serde_json::Number),
22 Text(String),
23}
24
25#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
26#[serde(deny_unknown_fields, rename_all = "camelCase")]
27pub struct RuleTrigger {
28 #[serde(
29 default,
30 skip_serializing_if = "Option::is_none",
31 deserialize_with = "present_nullable"
32 )]
33 pub advanced_filter: Option<Option<String>>,
34 #[serde(
35 default,
36 skip_serializing_if = "Option::is_none",
37 deserialize_with = "present_nullable"
38 )]
39 pub text_contains: Option<Option<String>>,
40 #[serde(
41 default,
42 skip_serializing_if = "Option::is_none",
43 deserialize_with = "present_nullable"
44 )]
45 pub cron: Option<Option<String>>,
46 #[serde(
47 default,
48 skip_serializing_if = "Option::is_none",
49 deserialize_with = "present_nullable"
50 )]
51 pub direction: Option<Option<String>>,
52
53 #[serde(
54 default,
55 skip_serializing_if = "Option::is_none",
56 deserialize_with = "present_nullable"
57 )]
58 pub activity_type: Option<Option<String>>,
59 #[serde(
60 default,
61 skip_serializing_if = "Option::is_none",
62 deserialize_with = "present_nullable"
63 )]
64 pub description: Option<Option<String>>,
65 #[serde(
66 default,
67 skip_serializing_if = "Option::is_none",
68 deserialize_with = "present_nullable"
69 )]
70 pub user_id: Option<Option<String>>,
71 #[serde(
72 default,
73 skip_serializing_if = "Option::is_none",
74 deserialize_with = "present_nullable"
75 )]
76 pub username: Option<Option<String>>,
77 #[serde(
78 default,
79 skip_serializing_if = "Option::is_none",
80 deserialize_with = "present_nullable"
81 )]
82 pub list_name: Option<Option<String>>,
83 #[serde(
84 default,
85 skip_serializing_if = "Option::is_none",
86 deserialize_with = "present_nullable"
87 )]
88 pub old_list_name: Option<Option<String>>,
89 #[serde(
90 default,
91 skip_serializing_if = "Option::is_none",
92 deserialize_with = "present_nullable"
93 )]
94 pub swimlane_name: Option<Option<String>>,
95 #[serde(
96 default,
97 skip_serializing_if = "Option::is_none",
98 deserialize_with = "present_nullable"
99 )]
100 pub card_title: Option<Option<String>>,
101 #[serde(
102 default,
103 skip_serializing_if = "Option::is_none",
104 deserialize_with = "present_nullable"
105 )]
106 pub checklist_name: Option<Option<String>>,
107 #[serde(
108 default,
109 skip_serializing_if = "Option::is_none",
110 deserialize_with = "present_nullable"
111 )]
112 pub checklist_item_name: Option<Option<String>>,
113 #[serde(
114 default,
115 skip_serializing_if = "Option::is_none",
116 deserialize_with = "present_nullable"
117 )]
118 pub label_id: Option<Option<String>>,
119 #[serde(
120 default,
121 skip_serializing_if = "Option::is_none",
122 deserialize_with = "present_nullable"
123 )]
124 pub attachment_name: Option<Option<String>>,
125 #[serde(
126 default,
127 skip_serializing_if = "Option::is_none",
128 deserialize_with = "present_nullable"
129 )]
130 pub desc: Option<Option<String>>,
131 #[serde(
132 default,
133 skip_serializing_if = "Option::is_none",
134 deserialize_with = "present_nullable"
135 )]
136 pub schedule_kind: Option<Option<String>>,
137 #[serde(
138 default,
139 skip_serializing_if = "Option::is_none",
140 deserialize_with = "present_nullable"
141 )]
142 pub schedule_type: Option<Option<String>>,
143 #[serde(
144 default,
145 skip_serializing_if = "Option::is_none",
146 deserialize_with = "present_nullable"
147 )]
148 pub at_time: Option<Option<String>>,
149 #[serde(
150 default,
151 skip_serializing_if = "Option::is_none",
152 deserialize_with = "present_nullable"
153 )]
154 pub weekday: Option<Option<RuleNumber>>,
155 #[serde(
156 default,
157 skip_serializing_if = "Option::is_none",
158 deserialize_with = "present_nullable"
159 )]
160 pub day_of_month: Option<Option<RuleNumber>>,
161 #[serde(
162 default,
163 skip_serializing_if = "Option::is_none",
164 deserialize_with = "present_nullable"
165 )]
166 pub on_date: Option<Option<String>>,
167 #[serde(
168 default,
169 skip_serializing_if = "Option::is_none",
170 deserialize_with = "present_nullable"
171 )]
172 pub due_condition: Option<Option<String>>,
173 #[serde(
174 default,
175 skip_serializing_if = "Option::is_none",
176 deserialize_with = "present_nullable"
177 )]
178 pub days: Option<Option<RuleNumber>>,
179 #[serde(
180 default,
181 skip_serializing_if = "Option::is_none",
182 deserialize_with = "present_nullable"
183 )]
184 pub last_run_key: Option<Option<String>>,
185 #[serde(
186 default,
187 skip_serializing_if = "Option::is_none",
188 deserialize_with = "present_nullable"
189 )]
190 pub last_run_at: Option<Option<String>>,
191 #[serde(
192 default,
193 skip_serializing_if = "Option::is_none",
194 deserialize_with = "present_nullable"
195 )]
196 pub button_type: Option<Option<String>>,
197 #[serde(
198 default,
199 skip_serializing_if = "Option::is_none",
200 deserialize_with = "present_nullable"
201 )]
202 pub button_label: Option<Option<String>>,
203}
204
205#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
206#[serde(deny_unknown_fields, rename_all = "camelCase")]
207pub struct RuleAction {
208 #[serde(
209 default,
210 skip_serializing_if = "Option::is_none",
211 deserialize_with = "present_nullable"
212 )]
213 pub include_card_details: Option<Option<bool>>,
214 #[serde(
215 default,
216 skip_serializing_if = "Option::is_none",
217 deserialize_with = "present_nullable"
218 )]
219 pub include_checklists_and_comments: Option<Option<bool>>,
220 #[serde(
221 default,
222 skip_serializing_if = "Option::is_none",
223 deserialize_with = "present_nullable"
224 )]
225 pub include_attachments: Option<Option<bool>>,
226 #[serde(
227 default,
228 skip_serializing_if = "Option::is_none",
229 deserialize_with = "present_nullable"
230 )]
231 pub integration_id: Option<Option<String>>,
232 #[serde(
233 default,
234 skip_serializing_if = "Option::is_none",
235 deserialize_with = "present_nullable"
236 )]
237 pub comment_text: Option<Option<String>>,
238 #[serde(
239 default,
240 skip_serializing_if = "Option::is_none",
241 deserialize_with = "present_nullable"
242 )]
243 pub list_id: Option<Option<String>>,
244 #[serde(
245 default,
246 skip_serializing_if = "Option::is_none",
247 deserialize_with = "present_nullable"
248 )]
249 pub swimlane_id: Option<Option<String>>,
250
251 #[serde(
252 default,
253 skip_serializing_if = "Option::is_none",
254 deserialize_with = "present_nullable"
255 )]
256 pub action_type: Option<Option<String>>,
257 #[serde(
258 default,
259 skip_serializing_if = "Option::is_none",
260 deserialize_with = "present_nullable"
261 )]
262 pub list_name: Option<Option<String>>,
263 #[serde(
264 default,
265 skip_serializing_if = "Option::is_none",
266 deserialize_with = "present_nullable"
267 )]
268 pub swimlane_name: Option<Option<String>>,
269 #[serde(
270 default,
271 skip_serializing_if = "Option::is_none",
272 deserialize_with = "present_nullable"
273 )]
274 pub card_name: Option<Option<String>>,
275 #[serde(
276 default,
277 skip_serializing_if = "Option::is_none",
278 deserialize_with = "present_nullable"
279 )]
280 pub from_list_name: Option<Option<String>>,
281 #[serde(
282 default,
283 skip_serializing_if = "Option::is_none",
284 deserialize_with = "present_nullable"
285 )]
286 pub checklist_name: Option<Option<String>>,
287 #[serde(
288 default,
289 skip_serializing_if = "Option::is_none",
290 deserialize_with = "present_nullable"
291 )]
292 pub check_item_name: Option<Option<String>>,
293 #[serde(
294 default,
295 skip_serializing_if = "Option::is_none",
296 deserialize_with = "present_nullable"
297 )]
298 pub checklist_items: Option<Option<String>>,
299 #[serde(
300 default,
301 skip_serializing_if = "Option::is_none",
302 deserialize_with = "present_nullable"
303 )]
304 pub date_field: Option<Option<String>>,
305 #[serde(
306 default,
307 skip_serializing_if = "Option::is_none",
308 deserialize_with = "present_nullable"
309 )]
310 pub unit: Option<Option<String>>,
311 #[serde(
312 default,
313 skip_serializing_if = "Option::is_none",
314 deserialize_with = "present_nullable"
315 )]
316 pub email_to: Option<Option<String>>,
317 #[serde(
318 default,
319 skip_serializing_if = "Option::is_none",
320 deserialize_with = "present_nullable"
321 )]
322 pub email_subject: Option<Option<String>>,
323 #[serde(
324 default,
325 skip_serializing_if = "Option::is_none",
326 deserialize_with = "present_nullable"
327 )]
328 pub email_msg: Option<Option<String>>,
329 #[serde(
330 default,
331 skip_serializing_if = "Option::is_none",
332 deserialize_with = "present_nullable"
333 )]
334 pub selected_color: Option<Option<String>>,
335 #[serde(
336 default,
337 skip_serializing_if = "Option::is_none",
338 deserialize_with = "present_nullable"
339 )]
340 pub label_id: Option<Option<String>>,
341 #[serde(
342 default,
343 skip_serializing_if = "Option::is_none",
344 deserialize_with = "present_nullable"
345 )]
346 pub username: Option<Option<String>>,
347 #[serde(
348 default,
349 skip_serializing_if = "Option::is_none",
350 deserialize_with = "present_nullable"
351 )]
352 pub sort_field: Option<Option<String>>,
353 #[serde(
354 default,
355 skip_serializing_if = "Option::is_none",
356 deserialize_with = "present_nullable"
357 )]
358 pub desc: Option<Option<String>>,
359 #[serde(
360 default,
361 skip_serializing_if = "Option::is_none",
362 deserialize_with = "present_nullable"
363 )]
364 pub days: Option<Option<RuleNumber>>,
365}
366
367#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
368#[serde(deny_unknown_fields, rename_all = "camelCase")]
369pub struct RuleTriggerInput {
370 #[serde(
371 default,
372 skip_serializing_if = "Option::is_none",
373 deserialize_with = "present_nullable"
374 )]
375 pub advanced_filter: Option<Option<String>>,
376 #[serde(
377 default,
378 skip_serializing_if = "Option::is_none",
379 deserialize_with = "present_nullable"
380 )]
381 pub text_contains: Option<Option<String>>,
382 #[serde(
383 default,
384 skip_serializing_if = "Option::is_none",
385 deserialize_with = "present_nullable"
386 )]
387 pub cron: Option<Option<String>>,
388 #[serde(
389 default,
390 skip_serializing_if = "Option::is_none",
391 deserialize_with = "present_nullable"
392 )]
393 pub direction: Option<Option<String>>,
394
395 #[serde(
396 default,
397 skip_serializing_if = "Option::is_none",
398 deserialize_with = "present_nullable"
399 )]
400 pub activity_type: Option<Option<String>>,
401 #[serde(
402 default,
403 skip_serializing_if = "Option::is_none",
404 deserialize_with = "present_nullable"
405 )]
406 pub description: Option<Option<String>>,
407 #[serde(
408 default,
409 skip_serializing_if = "Option::is_none",
410 deserialize_with = "present_nullable"
411 )]
412 pub user_id: Option<Option<String>>,
413 #[serde(
414 default,
415 skip_serializing_if = "Option::is_none",
416 deserialize_with = "present_nullable"
417 )]
418 pub username: Option<Option<String>>,
419 #[serde(
420 default,
421 skip_serializing_if = "Option::is_none",
422 deserialize_with = "present_nullable"
423 )]
424 pub list_name: Option<Option<String>>,
425 #[serde(
426 default,
427 skip_serializing_if = "Option::is_none",
428 deserialize_with = "present_nullable"
429 )]
430 pub old_list_name: Option<Option<String>>,
431 #[serde(
432 default,
433 skip_serializing_if = "Option::is_none",
434 deserialize_with = "present_nullable"
435 )]
436 pub swimlane_name: Option<Option<String>>,
437 #[serde(
438 default,
439 skip_serializing_if = "Option::is_none",
440 deserialize_with = "present_nullable"
441 )]
442 pub card_title: Option<Option<String>>,
443 #[serde(
444 default,
445 skip_serializing_if = "Option::is_none",
446 deserialize_with = "present_nullable"
447 )]
448 pub checklist_name: Option<Option<String>>,
449 #[serde(
450 default,
451 skip_serializing_if = "Option::is_none",
452 deserialize_with = "present_nullable"
453 )]
454 pub checklist_item_name: Option<Option<String>>,
455 #[serde(
456 default,
457 skip_serializing_if = "Option::is_none",
458 deserialize_with = "present_nullable"
459 )]
460 pub label_id: Option<Option<String>>,
461 #[serde(
462 default,
463 skip_serializing_if = "Option::is_none",
464 deserialize_with = "present_nullable"
465 )]
466 pub attachment_name: Option<Option<String>>,
467 #[serde(
468 default,
469 skip_serializing_if = "Option::is_none",
470 deserialize_with = "present_nullable"
471 )]
472 pub desc: Option<Option<String>>,
473 #[serde(
474 default,
475 skip_serializing_if = "Option::is_none",
476 deserialize_with = "present_nullable"
477 )]
478 pub schedule_kind: Option<Option<String>>,
479 #[serde(
480 default,
481 skip_serializing_if = "Option::is_none",
482 deserialize_with = "present_nullable"
483 )]
484 pub schedule_type: Option<Option<String>>,
485 #[serde(
486 default,
487 skip_serializing_if = "Option::is_none",
488 deserialize_with = "present_nullable"
489 )]
490 pub at_time: Option<Option<String>>,
491 #[serde(
492 default,
493 skip_serializing_if = "Option::is_none",
494 deserialize_with = "present_nullable"
495 )]
496 pub weekday: Option<Option<RuleNumber>>,
497 #[serde(
498 default,
499 skip_serializing_if = "Option::is_none",
500 deserialize_with = "present_nullable"
501 )]
502 pub day_of_month: Option<Option<RuleNumber>>,
503 #[serde(
504 default,
505 skip_serializing_if = "Option::is_none",
506 deserialize_with = "present_nullable"
507 )]
508 pub on_date: Option<Option<String>>,
509 #[serde(
510 default,
511 skip_serializing_if = "Option::is_none",
512 deserialize_with = "present_nullable"
513 )]
514 pub due_condition: Option<Option<String>>,
515 #[serde(
516 default,
517 skip_serializing_if = "Option::is_none",
518 deserialize_with = "present_nullable"
519 )]
520 pub days: Option<Option<RuleNumber>>,
521 #[serde(
522 default,
523 skip_serializing_if = "Option::is_none",
524 deserialize_with = "present_nullable"
525 )]
526 pub last_run_key: Option<Option<String>>,
527 #[serde(
528 default,
529 skip_serializing_if = "Option::is_none",
530 deserialize_with = "present_nullable_date"
531 )]
532 pub last_run_at: Option<Option<String>>,
533 #[serde(
534 default,
535 skip_serializing_if = "Option::is_none",
536 deserialize_with = "present_nullable"
537 )]
538 pub button_type: Option<Option<String>>,
539 #[serde(
540 default,
541 skip_serializing_if = "Option::is_none",
542 deserialize_with = "present_nullable"
543 )]
544 pub button_label: Option<Option<String>>,
545 #[serde(
546 default,
547 skip_serializing_if = "Option::is_none",
548 deserialize_with = "present_nullable"
549 )]
550 #[serde(rename = "_id")]
551 pub id: Option<Option<String>>,
552 #[serde(
553 default,
554 skip_serializing_if = "Option::is_none",
555 deserialize_with = "present_nullable"
556 )]
557 pub board_id: Option<Option<String>>,
558 #[serde(
559 default,
560 skip_serializing_if = "Option::is_none",
561 deserialize_with = "present_nullable"
562 )]
563 pub created_at: Option<Option<String>>,
564 #[serde(
565 default,
566 skip_serializing_if = "Option::is_none",
567 deserialize_with = "present_nullable"
568 )]
569 pub modified_at: Option<Option<String>>,
570 #[serde(
571 default,
572 skip_serializing_if = "Option::is_none",
573 deserialize_with = "present_nullable"
574 )]
575 pub updated_at: Option<Option<String>>,
576}
577
578#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
579#[serde(deny_unknown_fields, rename_all = "camelCase")]
580pub struct RuleActionInput {
581 #[serde(
582 default,
583 skip_serializing_if = "Option::is_none",
584 deserialize_with = "present_nullable"
585 )]
586 pub include_card_details: Option<Option<bool>>,
587 #[serde(
588 default,
589 skip_serializing_if = "Option::is_none",
590 deserialize_with = "present_nullable"
591 )]
592 pub include_checklists_and_comments: Option<Option<bool>>,
593 #[serde(
594 default,
595 skip_serializing_if = "Option::is_none",
596 deserialize_with = "present_nullable"
597 )]
598 pub include_attachments: Option<Option<bool>>,
599 #[serde(
600 default,
601 skip_serializing_if = "Option::is_none",
602 deserialize_with = "present_nullable"
603 )]
604 pub integration_id: Option<Option<String>>,
605 #[serde(
606 default,
607 skip_serializing_if = "Option::is_none",
608 deserialize_with = "present_nullable"
609 )]
610 pub comment_text: Option<Option<String>>,
611 #[serde(
612 default,
613 skip_serializing_if = "Option::is_none",
614 deserialize_with = "present_nullable"
615 )]
616 pub list_id: Option<Option<String>>,
617 #[serde(
618 default,
619 skip_serializing_if = "Option::is_none",
620 deserialize_with = "present_nullable"
621 )]
622 pub swimlane_id: Option<Option<String>>,
623
624 #[serde(
625 default,
626 skip_serializing_if = "Option::is_none",
627 deserialize_with = "present_nullable"
628 )]
629 pub action_type: Option<Option<String>>,
630 #[serde(
631 default,
632 skip_serializing_if = "Option::is_none",
633 deserialize_with = "present_nullable"
634 )]
635 pub list_name: Option<Option<String>>,
636 #[serde(
637 default,
638 skip_serializing_if = "Option::is_none",
639 deserialize_with = "present_nullable"
640 )]
641 pub swimlane_name: Option<Option<String>>,
642 #[serde(
643 default,
644 skip_serializing_if = "Option::is_none",
645 deserialize_with = "present_nullable"
646 )]
647 pub card_name: Option<Option<String>>,
648 #[serde(
649 default,
650 skip_serializing_if = "Option::is_none",
651 deserialize_with = "present_nullable"
652 )]
653 pub from_list_name: Option<Option<String>>,
654 #[serde(
655 default,
656 skip_serializing_if = "Option::is_none",
657 deserialize_with = "present_nullable"
658 )]
659 pub checklist_name: Option<Option<String>>,
660 #[serde(
661 default,
662 skip_serializing_if = "Option::is_none",
663 deserialize_with = "present_nullable"
664 )]
665 pub check_item_name: Option<Option<String>>,
666 #[serde(
667 default,
668 skip_serializing_if = "Option::is_none",
669 deserialize_with = "present_nullable"
670 )]
671 pub checklist_items: Option<Option<String>>,
672 #[serde(
673 default,
674 skip_serializing_if = "Option::is_none",
675 deserialize_with = "present_nullable"
676 )]
677 pub date_field: Option<Option<String>>,
678 #[serde(
679 default,
680 skip_serializing_if = "Option::is_none",
681 deserialize_with = "present_nullable"
682 )]
683 pub unit: Option<Option<String>>,
684 #[serde(
685 default,
686 skip_serializing_if = "Option::is_none",
687 deserialize_with = "present_nullable"
688 )]
689 pub email_to: Option<Option<String>>,
690 #[serde(
691 default,
692 skip_serializing_if = "Option::is_none",
693 deserialize_with = "present_nullable"
694 )]
695 pub email_subject: Option<Option<String>>,
696 #[serde(
697 default,
698 skip_serializing_if = "Option::is_none",
699 deserialize_with = "present_nullable"
700 )]
701 pub email_msg: Option<Option<String>>,
702 #[serde(
703 default,
704 skip_serializing_if = "Option::is_none",
705 deserialize_with = "present_nullable"
706 )]
707 pub selected_color: Option<Option<String>>,
708 #[serde(
709 default,
710 skip_serializing_if = "Option::is_none",
711 deserialize_with = "present_nullable"
712 )]
713 pub label_id: Option<Option<String>>,
714 #[serde(
715 default,
716 skip_serializing_if = "Option::is_none",
717 deserialize_with = "present_nullable"
718 )]
719 pub username: Option<Option<String>>,
720 #[serde(
721 default,
722 skip_serializing_if = "Option::is_none",
723 deserialize_with = "present_nullable"
724 )]
725 pub sort_field: Option<Option<String>>,
726 #[serde(
727 default,
728 skip_serializing_if = "Option::is_none",
729 deserialize_with = "present_nullable"
730 )]
731 pub desc: Option<Option<String>>,
732 #[serde(
733 default,
734 skip_serializing_if = "Option::is_none",
735 deserialize_with = "present_nullable"
736 )]
737 pub days: Option<Option<RuleNumber>>,
738 #[serde(
739 default,
740 skip_serializing_if = "Option::is_none",
741 deserialize_with = "present_nullable"
742 )]
743 #[serde(rename = "_id")]
744 pub id: Option<Option<String>>,
745 #[serde(
746 default,
747 skip_serializing_if = "Option::is_none",
748 deserialize_with = "present_nullable"
749 )]
750 pub board_id: Option<Option<String>>,
751 #[serde(
752 default,
753 skip_serializing_if = "Option::is_none",
754 deserialize_with = "present_nullable"
755 )]
756 pub created_at: Option<Option<String>>,
757 #[serde(
758 default,
759 skip_serializing_if = "Option::is_none",
760 deserialize_with = "present_nullable"
761 )]
762 pub modified_at: Option<Option<String>>,
763 #[serde(
764 default,
765 skip_serializing_if = "Option::is_none",
766 deserialize_with = "present_nullable"
767 )]
768 pub updated_at: Option<Option<String>>,
769}