Skip to main content

wekan_cli/client/rules/
payloads.rs

1//! Explicit sparse trigger/action fields. Unmapped properties are rejected.
2use 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/// Wekan's schedule/relative-date consumers accept numbers and numeric text.
18#[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}