Skip to main content

fhir_types/r4b/
trigger_definition.rs

1// @generated by fhir-codegen from hl7.fhir.r4b.core 4.3.0. DO NOT EDIT.
2// Change the emitter (tools/fhir-codegen) and regenerate.
3// SPDX-FileCopyrightText: Cadasto B.V.
4// SPDX-License-Identifier: Apache-2.0
5//! Defines an expected trigger for a module
6
7/// Defines an expected trigger for a module
8///
9/// A description of a triggering event. Triggering events can be named events,
10/// data events, or periodic, as determined by the type element.
11#[derive(Debug, Clone, Default, PartialEq, Eq)]
12pub struct TriggerDefinition {
13    /// Unique id for inter-element referencing
14    ///
15    /// Unique id for the element within a resource (for internal references). This
16    /// may be any string value that does not contain spaces.
17    pub id: Option<std::string::String>,
18    /// Additional content defined by implementations
19    ///
20    /// May be used to represent additional information that is not part of the
21    /// basic definition of the element. To make the use of extensions safe and
22    /// manageable, there is a strict set of governance applied to the definition
23    /// and use of extensions. Though any implementer can define an extension, there
24    /// is a set of requirements that SHALL be met as part of the definition of the
25    /// extension.
26    pub extension: Vec<super::extension::Extension>,
27    /// named-event | periodic | data-changed | data-added | data-modified |
28    /// data-removed | data-accessed | data-access-ended
29    ///
30    /// The type of triggering event.
31    pub r#type: super::primitives::Code,
32    /// Name or URI that identifies the event
33    ///
34    /// A formal name for the event. This may be an absolute URI that identifies the
35    /// event formally (e.g. from a trigger registry), or a simple relative URI that
36    /// identifies the event in a local context.
37    pub name: Option<super::primitives::String>,
38    /// Timing of the event
39    ///
40    /// The timing of the event (if this is a periodic trigger).
41    pub timing: Option<TriggerDefinitionTiming>,
42    /// Triggering data of the event (multiple = 'and')
43    ///
44    /// The triggering data of the event (if this is a data trigger). If more than
45    /// one data is requirement is specified, then all the data requirements must be
46    /// true.
47    pub data: Vec<super::data_requirement::DataRequirement>,
48    /// Whether the event triggers (boolean expression)
49    ///
50    /// A boolean-valued expression that is evaluated in the context of the
51    /// container of the trigger definition and returns whether or not the trigger
52    /// fires.
53    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/// The \`timing\[x\]\` choice of \`TriggerDefinition\`.
349///
350/// The timing of the event (if this is a periodic trigger).
351#[derive(Debug, Clone, PartialEq, Eq)]
352pub enum TriggerDefinitionTiming {
353    /// The `Timing` form.
354    Timing(Box<super::timing::Timing>),
355    /// The `Reference` form.
356    Reference(Box<super::reference::Reference>),
357    /// The `date` form.
358    Date(super::primitives::Date),
359    /// The `dateTime` form.
360    DateTime(super::primitives::DateTime),
361}
362
363impl TriggerDefinitionTiming {
364    /// The key suffix, the value part, and the `_name` part of this form.
365    ///
366    /// # Errors
367    ///
368    /// Returns [`super::super::codec::EncodeError`] when a held value has no JSON form.
369    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    /// Decodes the form named by `suffix` from its value and `_name` parts.
408    ///
409    /// # Errors
410    ///
411    /// Returns [`super::super::codec::DecodeError`] for an unknown suffix or a malformed part.
412    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}