1use crate::client::rules::{RuleDocument, RuleNumber};
2use serde::Serialize;
3
4#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
5pub struct RuleTriggerDetail {
6 #[serde(skip_serializing_if = "Option::is_none")]
7 pub advanced_filter: Option<Option<String>>,
8 #[serde(skip_serializing_if = "Option::is_none")]
9 pub text_contains: Option<Option<String>>,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub cron: Option<Option<String>>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub direction: Option<Option<String>>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub activity_type: Option<Option<String>>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub description: Option<Option<String>>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub user_id: Option<Option<String>>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub username: Option<Option<String>>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub list_name: Option<Option<String>>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub old_list_name: Option<Option<String>>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub swimlane_name: Option<Option<String>>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub card_title: Option<Option<String>>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub checklist_name: Option<Option<String>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub checklist_item_name: Option<Option<String>>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub label_id: Option<Option<String>>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub attachment_name: Option<Option<String>>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub desc: Option<Option<String>>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub schedule_kind: Option<Option<String>>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub schedule_type: Option<Option<String>>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub at_time: Option<Option<String>>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub weekday: Option<Option<RuleNumber>>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub day_of_month: Option<Option<RuleNumber>>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub on_date: Option<Option<String>>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub due_condition: Option<Option<String>>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub days: Option<Option<RuleNumber>>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub last_run_key: Option<Option<String>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub last_run_at: Option<Option<String>>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub button_type: Option<Option<String>>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub button_label: Option<Option<String>>,
65}
66impl From<crate::client::rules::RuleTrigger> for RuleTriggerDetail {
67 fn from(d: crate::client::rules::RuleTrigger) -> Self {
68 Self {
69 advanced_filter: d.advanced_filter,
70 text_contains: d.text_contains,
71 cron: d.cron,
72 direction: d.direction,
73
74 activity_type: d.activity_type,
75 description: d.description,
76 user_id: d.user_id,
77 username: d.username,
78 list_name: d.list_name,
79 old_list_name: d.old_list_name,
80 swimlane_name: d.swimlane_name,
81 card_title: d.card_title,
82 checklist_name: d.checklist_name,
83 checklist_item_name: d.checklist_item_name,
84 label_id: d.label_id,
85 attachment_name: d.attachment_name,
86 desc: d.desc,
87 schedule_kind: d.schedule_kind,
88 schedule_type: d.schedule_type,
89 at_time: d.at_time,
90 weekday: d.weekday,
91 day_of_month: d.day_of_month,
92 on_date: d.on_date,
93 due_condition: d.due_condition,
94 days: d.days,
95 last_run_key: d.last_run_key,
96 last_run_at: d.last_run_at,
97 button_type: d.button_type,
98 button_label: d.button_label,
99 }
100 }
101}
102
103#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
104pub struct RuleActionDetail {
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub include_card_details: Option<Option<bool>>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub include_checklists_and_comments: Option<Option<bool>>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub include_attachments: Option<Option<bool>>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub integration_id: Option<Option<String>>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub comment_text: Option<Option<String>>,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub list_id: Option<Option<String>>,
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub swimlane_id: Option<Option<String>>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub action_type: Option<Option<String>>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub list_name: Option<Option<String>>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub swimlane_name: Option<Option<String>>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub card_name: Option<Option<String>>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub from_list_name: Option<Option<String>>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub checklist_name: Option<Option<String>>,
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub check_item_name: Option<Option<String>>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub checklist_items: Option<Option<String>>,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub date_field: Option<Option<String>>,
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub unit: Option<Option<String>>,
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub email_to: Option<Option<String>>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub email_subject: Option<Option<String>>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub email_msg: Option<Option<String>>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub selected_color: Option<Option<String>>,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub label_id: Option<Option<String>>,
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub username: Option<Option<String>>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub sort_field: Option<Option<String>>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub desc: Option<Option<String>>,
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub days: Option<Option<RuleNumber>>,
158}
159impl From<crate::client::rules::RuleAction> for RuleActionDetail {
160 fn from(d: crate::client::rules::RuleAction) -> Self {
161 Self {
162 include_card_details: d.include_card_details,
163 include_checklists_and_comments: d.include_checklists_and_comments,
164 include_attachments: d.include_attachments,
165 integration_id: d.integration_id,
166 comment_text: d.comment_text,
167 list_id: d.list_id,
168 swimlane_id: d.swimlane_id,
169
170 action_type: d.action_type,
171 list_name: d.list_name,
172 swimlane_name: d.swimlane_name,
173 card_name: d.card_name,
174 from_list_name: d.from_list_name,
175 checklist_name: d.checklist_name,
176 check_item_name: d.check_item_name,
177 checklist_items: d.checklist_items,
178 date_field: d.date_field,
179 unit: d.unit,
180 email_to: d.email_to,
181 email_subject: d.email_subject,
182 email_msg: d.email_msg,
183 selected_color: d.selected_color,
184 label_id: d.label_id,
185 username: d.username,
186 sort_field: d.sort_field,
187 desc: d.desc,
188 days: d.days,
189 }
190 }
191}
192
193#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
194pub struct RuleDetail {
195 pub enabled: bool,
196 pub extra_triggers: Option<Vec<RuleTriggerDetail>>,
197 pub extra_actions: Option<Vec<RuleActionDetail>>,
198 pub board_id: String,
199 pub rule_id: String,
200 pub title: String,
201 pub trigger: Option<RuleTriggerDetail>,
202 pub action: Option<RuleActionDetail>,
203}
204impl RuleDetail {
205 pub(crate) fn from_document(board_id: String, d: RuleDocument) -> Self {
206 Self {
207 enabled: d.enabled,
208 extra_triggers: d
209 .extra_triggers
210 .map(|items| items.into_iter().map(Into::into).collect()),
211 extra_actions: d
212 .extra_actions
213 .map(|items| items.into_iter().map(Into::into).collect()),
214 board_id,
215 rule_id: d.rule_id,
216 title: d.title,
217 trigger: d.trigger.map(Into::into),
218 action: d.action.map(Into::into),
219 }
220 }
221}
222#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
223pub struct RuleCollectionSuccess {
224 pub board_id: String,
225 pub rules: Vec<RuleDetail>,
226}
227#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
228pub struct RuleCreateSuccess {
229 pub board_id: String,
230 pub rule_id: String,
231 pub trigger_id: String,
232 pub action_id: String,
233}
234#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
235#[serde(rename_all = "snake_case")]
236pub enum RuleSubmittedField {
237 Enabled,
238 Title,
239 Trigger,
240 Action,
241}
242#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
243pub struct RuleUpdateSuccess {
244 pub board_id: String,
245 pub rule_id: String,
246 pub submitted_fields: Vec<RuleSubmittedField>,
247}
248#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
249pub struct RuleDeleteSuccess {
250 pub board_id: String,
251 pub rule_id: String,
252 pub deleted: bool,
253}