1#[derive(Debug, Clone, Default, PartialEq, Eq)]
12pub struct TriggerDefinition {
13 pub id: Option<std::string::String>,
18 pub extension: Vec<super::extension::Extension>,
27 pub r#type: super::primitives::Code,
32 pub name: Option<super::primitives::String>,
38 pub timing: Option<TriggerDefinitionTiming>,
42 pub data: Vec<super::data_requirement::DataRequirement>,
48 pub condition: Option<super::expression::Expression>,
54}
55
56impl super::super::codec::Json for TriggerDefinition {
57 fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
58 let mut object = super::super::codec::Object::new();
59 if let Some(v) = &self.id {
60 object.insert(
61 std::string::String::from("id"),
62 super::super::codec::Value::String(v.clone()),
63 );
64 }
65 if !self.extension.is_empty() {
66 let mut items = Vec::with_capacity(self.extension.len());
67 for item in &self.extension {
68 items.push(super::super::codec::Value::Object(
69 super::super::codec::Json::to_json(item)?,
70 ));
71 }
72 object.insert(
73 std::string::String::from("extension"),
74 super::super::codec::Value::Array(items),
75 );
76 }
77 if let Some(v) = super::super::codec::Primitive::value_json(&self.r#type)? {
78 object.insert(std::string::String::from("type"), v);
79 }
80 if let Some(e) = super::super::codec::Primitive::element_json(&self.r#type)? {
81 object.insert(std::string::String::from("_type"), e);
82 }
83 if let Some(item) = &self.name {
84 if let Some(v) = super::super::codec::Primitive::value_json(item)? {
85 object.insert(std::string::String::from("name"), v);
86 }
87 if let Some(e) = super::super::codec::Primitive::element_json(item)? {
88 object.insert(std::string::String::from("_name"), e);
89 }
90 }
91 if let Some(item) = &self.timing {
92 let (suffix, value, element) = item.to_json_parts()?;
93 if let Some(value) = value {
94 object.insert(format!("timing{suffix}"), value);
95 }
96 if let Some(element) = element {
97 object.insert(format!("_timing{suffix}"), element);
98 }
99 }
100 if !self.data.is_empty() {
101 let mut items = Vec::with_capacity(self.data.len());
102 for item in &self.data {
103 items.push(super::super::codec::Value::Object(
104 super::super::codec::Json::to_json(item)?,
105 ));
106 }
107 object.insert(
108 std::string::String::from("data"),
109 super::super::codec::Value::Array(items),
110 );
111 }
112 if let Some(item) = &self.condition {
113 object.insert(
114 std::string::String::from("condition"),
115 super::super::codec::Value::Object(super::super::codec::Json::to_json(item)?),
116 );
117 }
118 Ok(object)
119 }
120
121 fn from_json(
122 object: &super::super::codec::Object,
123 path: &mut super::super::codec::Path,
124 ) -> Result<Self, super::super::codec::DecodeError> {
125 let mut raw_id: Option<&super::super::codec::Value> = None;
126 let mut raw_extension: Option<&super::super::codec::Value> = None;
127 let mut raw_type: Option<&super::super::codec::Value> = None;
128 let mut raw_type_element: Option<&super::super::codec::Value> = None;
129 let mut raw_name: Option<&super::super::codec::Value> = None;
130 let mut raw_name_element: Option<&super::super::codec::Value> = None;
131 let mut raw_timing = super::super::codec::ChoiceSlot::default();
132 let mut raw_data: Option<&super::super::codec::Value> = None;
133 let mut raw_condition: Option<&super::super::codec::Value> = None;
134 for (key, value) in object {
135 match key.as_str() {
136 "id" => {
137 raw_id = Some(value);
138 }
139 "extension" => {
140 raw_extension = Some(value);
141 }
142 "type" => {
143 raw_type = Some(value);
144 }
145 "_type" => {
146 raw_type_element = Some(value);
147 }
148 "name" => {
149 raw_name = Some(value);
150 }
151 "_name" => {
152 raw_name_element = Some(value);
153 }
154 "timingTiming" => {
155 raw_timing.value("Timing", value, path)?;
156 }
157 "_timingTiming" => {
158 raw_timing.element("Timing", value, path)?;
159 }
160 "timingReference" => {
161 raw_timing.value("Reference", value, path)?;
162 }
163 "_timingReference" => {
164 raw_timing.element("Reference", value, path)?;
165 }
166 "timingDate" => {
167 raw_timing.value("Date", value, path)?;
168 }
169 "_timingDate" => {
170 raw_timing.element("Date", value, path)?;
171 }
172 "timingDateTime" => {
173 raw_timing.value("DateTime", value, path)?;
174 }
175 "_timingDateTime" => {
176 raw_timing.element("DateTime", value, path)?;
177 }
178 "data" => {
179 raw_data = Some(value);
180 }
181 "condition" => {
182 raw_condition = Some(value);
183 }
184 other => {
185 return path.with(other, |path| {
186 Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
187 });
188 }
189 }
190 }
191 let field_id = raw_id
192 .map(|value| {
193 path.with("id", |path| {
194 let value = super::super::codec::expect_single(value, path)?;
195 super::primitives::checked_string(
196 super::super::codec::expect_string(value, path)?,
197 path,
198 )
199 })
200 })
201 .transpose()?;
202 let mut field_extension = Vec::new();
203 if let Some(raw) = raw_extension {
204 for (index, value) in path
205 .with("extension", |path| {
206 super::super::codec::expect_array(raw, path)
207 })?
208 .iter()
209 .enumerate()
210 {
211 field_extension.push(path.with_index("extension", index, |path| {
212 super::super::codec::Json::from_json(
213 super::super::codec::expect_object(value, path)?,
214 path,
215 )
216 })?);
217 }
218 }
219 let field_type = path.with("type", |path| {
220 super::super::codec::Primitive::from_json_parts(raw_type, raw_type_element, path)
221 })?;
222 let field_name = match (raw_name, raw_name_element) {
223 (None, None) => None,
224 (value, element) => Some(path.with("name", |path| {
225 super::super::codec::Primitive::from_json_parts(value, element, path)
226 })?),
227 };
228 let field_timing = match raw_timing.suffix {
229 None => None,
230 Some(suffix) => Some(path.with("timing", |path| {
231 TriggerDefinitionTiming::from_json_parts(
232 suffix,
233 raw_timing.value,
234 raw_timing.element,
235 path,
236 )
237 })?),
238 };
239 let mut field_data = Vec::new();
240 if let Some(raw) = raw_data {
241 for (index, value) in path
242 .with("data", |path| super::super::codec::expect_array(raw, path))?
243 .iter()
244 .enumerate()
245 {
246 field_data.push(path.with_index("data", index, |path| {
247 super::super::codec::Json::from_json(
248 super::super::codec::expect_object(value, path)?,
249 path,
250 )
251 })?);
252 }
253 }
254 let field_condition = raw_condition
255 .map(|value| {
256 path.with("condition", |path| {
257 super::super::codec::Json::from_json(
258 super::super::codec::expect_object(
259 super::super::codec::expect_single(value, path)?,
260 path,
261 )?,
262 path,
263 )
264 })
265 })
266 .transpose()?;
267 Ok(Self {
268 id: field_id,
269 extension: field_extension,
270 r#type: field_type,
271 name: field_name,
272 timing: field_timing,
273 data: field_data,
274 condition: field_condition,
275 })
276 }
277}
278
279impl serde::Serialize for TriggerDefinition {
280 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
281 let mut map = serde::Serializer::serialize_map(serializer, None)?;
282 if let Some(item) = &self.name {
283 super::super::codec::element_entry(&mut map, "_name", item)?;
284 }
285 match &self.timing {
286 Some(TriggerDefinitionTiming::Date(inner)) => {
287 super::super::codec::element_entry(&mut map, "_timingDate", inner)?;
288 }
289 Some(TriggerDefinitionTiming::DateTime(inner)) => {
290 super::super::codec::element_entry(&mut map, "_timingDateTime", inner)?;
291 }
292 _ => {}
293 }
294 super::super::codec::element_entry(&mut map, "_type", &self.r#type)?;
295 if let Some(item) = &self.condition {
296 serde::ser::SerializeMap::serialize_entry(&mut map, "condition", item)?;
297 }
298 if !self.data.is_empty() {
299 serde::ser::SerializeMap::serialize_entry(&mut map, "data", &self.data)?;
300 }
301 if !self.extension.is_empty() {
302 serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
303 }
304 if let Some(v) = &self.id {
305 serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
306 }
307 if let Some(item) = &self.name {
308 super::super::codec::value_entry(&mut map, "name", item)?;
309 }
310 match &self.timing {
311 Some(TriggerDefinitionTiming::Date(inner)) => {
312 super::super::codec::value_entry(&mut map, "timingDate", inner)?;
313 }
314 Some(TriggerDefinitionTiming::DateTime(inner)) => {
315 super::super::codec::value_entry(&mut map, "timingDateTime", inner)?;
316 }
317 Some(TriggerDefinitionTiming::Reference(inner)) => {
318 serde::ser::SerializeMap::serialize_entry(
319 &mut map,
320 "timingReference",
321 inner.as_ref(),
322 )?;
323 }
324 Some(TriggerDefinitionTiming::Timing(inner)) => {
325 serde::ser::SerializeMap::serialize_entry(
326 &mut map,
327 "timingTiming",
328 inner.as_ref(),
329 )?;
330 }
331 None => {}
332 }
333 super::super::codec::value_entry(&mut map, "type", &self.r#type)?;
334 serde::ser::SerializeMap::end(map)
335 }
336}
337
338impl<'de> serde::Deserialize<'de> for TriggerDefinition {
339 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
340 let value = <super::super::codec::Value as serde::Deserialize>::deserialize(deserializer)?;
341 let mut path = super::super::codec::Path::root("TriggerDefinition");
342 let object =
343 super::super::codec::expect_object(&value, &path).map_err(serde::de::Error::custom)?;
344 super::super::codec::Json::from_json(object, &mut path).map_err(serde::de::Error::custom)
345 }
346}
347
348#[derive(Debug, Clone, PartialEq, Eq)]
352pub enum TriggerDefinitionTiming {
353 Timing(Box<super::timing::Timing>),
355 Reference(Box<super::reference::Reference>),
357 Date(super::primitives::Date),
359 DateTime(super::primitives::DateTime),
361}
362
363impl TriggerDefinitionTiming {
364 pub fn to_json_parts(
370 &self,
371 ) -> Result<
372 (
373 &'static str,
374 Option<super::super::codec::Value>,
375 Option<super::super::codec::Value>,
376 ),
377 super::super::codec::EncodeError,
378 > {
379 match self {
380 Self::Timing(inner) => Ok((
381 "Timing",
382 Some(super::super::codec::Value::Object(
383 super::super::codec::Json::to_json(inner.as_ref())?,
384 )),
385 None,
386 )),
387 Self::Reference(inner) => Ok((
388 "Reference",
389 Some(super::super::codec::Value::Object(
390 super::super::codec::Json::to_json(inner.as_ref())?,
391 )),
392 None,
393 )),
394 Self::Date(inner) => Ok((
395 "Date",
396 super::super::codec::Primitive::value_json(inner)?,
397 super::super::codec::Primitive::element_json(inner)?,
398 )),
399 Self::DateTime(inner) => Ok((
400 "DateTime",
401 super::super::codec::Primitive::value_json(inner)?,
402 super::super::codec::Primitive::element_json(inner)?,
403 )),
404 }
405 }
406
407 pub fn from_json_parts(
413 suffix: &str,
414 value: Option<&super::super::codec::Value>,
415 element: Option<&super::super::codec::Value>,
416 path: &mut super::super::codec::Path,
417 ) -> Result<Self, super::super::codec::DecodeError> {
418 match suffix {
419 "Timing" => {
420 if element.is_some() {
421 return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
422 expected: "no underscore form for a complex type",
423 }));
424 }
425 let value = value.ok_or_else(|| {
426 path.error(super::super::codec::DecodeErrorKind::MissingProperty)
427 })?;
428 let inner = super::super::codec::Json::from_json(
429 super::super::codec::expect_object(
430 super::super::codec::expect_single(value, path)?,
431 path,
432 )?,
433 path,
434 )?;
435 Ok(Self::Timing(Box::new(inner)))
436 }
437 "Reference" => {
438 if element.is_some() {
439 return Err(path.error(super::super::codec::DecodeErrorKind::WrongType {
440 expected: "no underscore form for a complex type",
441 }));
442 }
443 let value = value.ok_or_else(|| {
444 path.error(super::super::codec::DecodeErrorKind::MissingProperty)
445 })?;
446 let inner = super::super::codec::Json::from_json(
447 super::super::codec::expect_object(
448 super::super::codec::expect_single(value, path)?,
449 path,
450 )?,
451 path,
452 )?;
453 Ok(Self::Reference(Box::new(inner)))
454 }
455 "Date" => Ok(Self::Date(super::super::codec::Primitive::from_json_parts(
456 value, element, path,
457 )?)),
458 "DateTime" => Ok(Self::DateTime(
459 super::super::codec::Primitive::from_json_parts(value, element, path)?,
460 )),
461 _ => Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty)),
462 }
463 }
464}