Skip to main content

fhir_types/r5/
sampled_data.rs

1// @generated by fhir-codegen from hl7.fhir.r5.core 5.0.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//! A series of measurements taken by a device
6
7/// A series of measurements taken by a device
8///
9/// A series of measurements taken by a device, with upper and lower limits.
10/// There may be more than one dimension in the data.
11#[derive(Debug, Clone, Default, PartialEq, Eq)]
12pub struct SampledData {
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    /// managable, there is a strict set of governance applied to the definition and
23    /// use of extensions. Though any implementer can define an extension, there is
24    /// 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    /// Zero value and units
28    ///
29    /// The base quantity that a measured value of zero represents. In addition,
30    /// this provides the units of the entire measurement series.
31    pub origin: super::quantity::Quantity,
32    /// Number of intervalUnits between samples
33    ///
34    /// Amount of intervalUnits between samples, e.g. milliseconds for time-based
35    /// sampling.
36    pub interval: Option<super::primitives::Decimal>,
37    /// The measurement unit of the interval between samples
38    ///
39    /// The measurement unit in which the sample interval is expressed.
40    pub interval_unit: super::primitives::Code,
41    /// Multiply data by this before adding to origin
42    ///
43    /// A correction factor that is applied to the sampled data points before they
44    /// are added to the origin.
45    pub factor: Option<super::primitives::Decimal>,
46    /// Lower limit of detection
47    ///
48    /// The lower limit of detection of the measured points. This is needed if any
49    /// of the data points have the value "L" (lower than detection limit).
50    pub lower_limit: Option<super::primitives::Decimal>,
51    /// Upper limit of detection
52    ///
53    /// The upper limit of detection of the measured points. This is needed if any
54    /// of the data points have the value "U" (higher than detection limit).
55    pub upper_limit: Option<super::primitives::Decimal>,
56    /// Number of sample points at each time point
57    ///
58    /// The number of sample points at each time point. If this value is greater
59    /// than one, then the dimensions will be interlaced - all the sample points for
60    /// a point in time will be recorded at once.
61    pub dimensions: super::primitives::PositiveInt,
62    /// Defines the codes used in the data
63    ///
64    /// Reference to ConceptMap that defines the codes used in the data.
65    pub code_map: Option<super::primitives::Canonical>,
66    /// Offsets, typically in time, at which data values were taken
67    ///
68    /// A series of data points which are decimal values separated by a single space
69    /// (character u20). The units in which the offsets are expressed are found in
70    /// intervalUnit. The absolute point at which the measurements begin SHALL be
71    /// conveyed outside the scope of this datatype, e.g.
72    /// Observation.effectiveDateTime for a timing offset.
73    pub offsets: Option<super::primitives::String>,
74    /// Decimal values with spaces, or "E" | "U" | "L", or another code
75    ///
76    /// A series of data points which are decimal values or codes separated by a
77    /// single space (character u20). The special codes "E" (error), "L" (below
78    /// detection limit) and "U" (above detection limit) are also defined for used
79    /// in place of decimal values.
80    pub data: Option<super::primitives::String>,
81}
82
83impl super::super::codec::Json for SampledData {
84    fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
85        let mut object = super::super::codec::Object::new();
86        if let Some(v) = &self.id {
87            object.insert(
88                std::string::String::from("id"),
89                super::super::codec::Value::String(v.clone()),
90            );
91        }
92        if !self.extension.is_empty() {
93            let mut items = Vec::with_capacity(self.extension.len());
94            for item in &self.extension {
95                items.push(super::super::codec::Value::Object(
96                    super::super::codec::Json::to_json(item)?,
97                ));
98            }
99            object.insert(
100                std::string::String::from("extension"),
101                super::super::codec::Value::Array(items),
102            );
103        }
104        object.insert(
105            std::string::String::from("origin"),
106            super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.origin)?),
107        );
108        if let Some(item) = &self.interval {
109            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
110                object.insert(std::string::String::from("interval"), v);
111            }
112            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
113                object.insert(std::string::String::from("_interval"), e);
114            }
115        }
116        if let Some(v) = super::super::codec::Primitive::value_json(&self.interval_unit)? {
117            object.insert(std::string::String::from("intervalUnit"), v);
118        }
119        if let Some(e) = super::super::codec::Primitive::element_json(&self.interval_unit)? {
120            object.insert(std::string::String::from("_intervalUnit"), e);
121        }
122        if let Some(item) = &self.factor {
123            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
124                object.insert(std::string::String::from("factor"), v);
125            }
126            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
127                object.insert(std::string::String::from("_factor"), e);
128            }
129        }
130        if let Some(item) = &self.lower_limit {
131            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
132                object.insert(std::string::String::from("lowerLimit"), v);
133            }
134            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
135                object.insert(std::string::String::from("_lowerLimit"), e);
136            }
137        }
138        if let Some(item) = &self.upper_limit {
139            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
140                object.insert(std::string::String::from("upperLimit"), v);
141            }
142            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
143                object.insert(std::string::String::from("_upperLimit"), e);
144            }
145        }
146        if let Some(v) = super::super::codec::Primitive::value_json(&self.dimensions)? {
147            object.insert(std::string::String::from("dimensions"), v);
148        }
149        if let Some(e) = super::super::codec::Primitive::element_json(&self.dimensions)? {
150            object.insert(std::string::String::from("_dimensions"), e);
151        }
152        if let Some(item) = &self.code_map {
153            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
154                object.insert(std::string::String::from("codeMap"), v);
155            }
156            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
157                object.insert(std::string::String::from("_codeMap"), e);
158            }
159        }
160        if let Some(item) = &self.offsets {
161            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
162                object.insert(std::string::String::from("offsets"), v);
163            }
164            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
165                object.insert(std::string::String::from("_offsets"), e);
166            }
167        }
168        if let Some(item) = &self.data {
169            if let Some(v) = super::super::codec::Primitive::value_json(item)? {
170                object.insert(std::string::String::from("data"), v);
171            }
172            if let Some(e) = super::super::codec::Primitive::element_json(item)? {
173                object.insert(std::string::String::from("_data"), e);
174            }
175        }
176        Ok(object)
177    }
178
179    fn from_json(
180        object: &super::super::codec::Object,
181        path: &mut super::super::codec::Path,
182    ) -> Result<Self, super::super::codec::DecodeError> {
183        let mut raw_id: Option<&super::super::codec::Value> = None;
184        let mut raw_extension: Option<&super::super::codec::Value> = None;
185        let mut raw_origin: Option<&super::super::codec::Value> = None;
186        let mut raw_interval: Option<&super::super::codec::Value> = None;
187        let mut raw_interval_element: Option<&super::super::codec::Value> = None;
188        let mut raw_interval_unit: Option<&super::super::codec::Value> = None;
189        let mut raw_interval_unit_element: Option<&super::super::codec::Value> = None;
190        let mut raw_factor: Option<&super::super::codec::Value> = None;
191        let mut raw_factor_element: Option<&super::super::codec::Value> = None;
192        let mut raw_lower_limit: Option<&super::super::codec::Value> = None;
193        let mut raw_lower_limit_element: Option<&super::super::codec::Value> = None;
194        let mut raw_upper_limit: Option<&super::super::codec::Value> = None;
195        let mut raw_upper_limit_element: Option<&super::super::codec::Value> = None;
196        let mut raw_dimensions: Option<&super::super::codec::Value> = None;
197        let mut raw_dimensions_element: Option<&super::super::codec::Value> = None;
198        let mut raw_code_map: Option<&super::super::codec::Value> = None;
199        let mut raw_code_map_element: Option<&super::super::codec::Value> = None;
200        let mut raw_offsets: Option<&super::super::codec::Value> = None;
201        let mut raw_offsets_element: Option<&super::super::codec::Value> = None;
202        let mut raw_data: Option<&super::super::codec::Value> = None;
203        let mut raw_data_element: Option<&super::super::codec::Value> = None;
204        for (key, value) in object {
205            match key.as_str() {
206                "id" => {
207                    raw_id = Some(value);
208                }
209                "extension" => {
210                    raw_extension = Some(value);
211                }
212                "origin" => {
213                    raw_origin = Some(value);
214                }
215                "interval" => {
216                    raw_interval = Some(value);
217                }
218                "_interval" => {
219                    raw_interval_element = Some(value);
220                }
221                "intervalUnit" => {
222                    raw_interval_unit = Some(value);
223                }
224                "_intervalUnit" => {
225                    raw_interval_unit_element = Some(value);
226                }
227                "factor" => {
228                    raw_factor = Some(value);
229                }
230                "_factor" => {
231                    raw_factor_element = Some(value);
232                }
233                "lowerLimit" => {
234                    raw_lower_limit = Some(value);
235                }
236                "_lowerLimit" => {
237                    raw_lower_limit_element = Some(value);
238                }
239                "upperLimit" => {
240                    raw_upper_limit = Some(value);
241                }
242                "_upperLimit" => {
243                    raw_upper_limit_element = Some(value);
244                }
245                "dimensions" => {
246                    raw_dimensions = Some(value);
247                }
248                "_dimensions" => {
249                    raw_dimensions_element = Some(value);
250                }
251                "codeMap" => {
252                    raw_code_map = Some(value);
253                }
254                "_codeMap" => {
255                    raw_code_map_element = Some(value);
256                }
257                "offsets" => {
258                    raw_offsets = Some(value);
259                }
260                "_offsets" => {
261                    raw_offsets_element = Some(value);
262                }
263                "data" => {
264                    raw_data = Some(value);
265                }
266                "_data" => {
267                    raw_data_element = Some(value);
268                }
269                other => {
270                    return path.with(other, |path| {
271                        Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
272                    });
273                }
274            }
275        }
276        let field_id = raw_id
277            .map(|value| {
278                path.with("id", |path| {
279                    let value = super::super::codec::expect_single(value, path)?;
280                    super::primitives::checked_string(
281                        super::super::codec::expect_string(value, path)?,
282                        path,
283                    )
284                })
285            })
286            .transpose()?;
287        let mut field_extension = Vec::new();
288        if let Some(raw) = raw_extension {
289            for (index, value) in path
290                .with("extension", |path| {
291                    super::super::codec::expect_array(raw, path)
292                })?
293                .iter()
294                .enumerate()
295            {
296                field_extension.push(path.with_index("extension", index, |path| {
297                    super::super::codec::Json::from_json(
298                        super::super::codec::expect_object(value, path)?,
299                        path,
300                    )
301                })?);
302            }
303        }
304        let field_origin = path.with("origin", |path| {
305            let value = raw_origin
306                .ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
307            super::super::codec::Json::from_json(
308                super::super::codec::expect_object(
309                    super::super::codec::expect_single(value, path)?,
310                    path,
311                )?,
312                path,
313            )
314        })?;
315        let field_interval = match (raw_interval, raw_interval_element) {
316            (None, None) => None,
317            (value, element) => Some(path.with("interval", |path| {
318                super::super::codec::Primitive::from_json_parts(value, element, path)
319            })?),
320        };
321        let field_interval_unit = path.with("intervalUnit", |path| {
322            super::super::codec::Primitive::from_json_parts(
323                raw_interval_unit,
324                raw_interval_unit_element,
325                path,
326            )
327        })?;
328        let field_factor = match (raw_factor, raw_factor_element) {
329            (None, None) => None,
330            (value, element) => Some(path.with("factor", |path| {
331                super::super::codec::Primitive::from_json_parts(value, element, path)
332            })?),
333        };
334        let field_lower_limit = match (raw_lower_limit, raw_lower_limit_element) {
335            (None, None) => None,
336            (value, element) => Some(path.with("lowerLimit", |path| {
337                super::super::codec::Primitive::from_json_parts(value, element, path)
338            })?),
339        };
340        let field_upper_limit = match (raw_upper_limit, raw_upper_limit_element) {
341            (None, None) => None,
342            (value, element) => Some(path.with("upperLimit", |path| {
343                super::super::codec::Primitive::from_json_parts(value, element, path)
344            })?),
345        };
346        let field_dimensions = path.with("dimensions", |path| {
347            super::super::codec::Primitive::from_json_parts(
348                raw_dimensions,
349                raw_dimensions_element,
350                path,
351            )
352        })?;
353        let field_code_map = match (raw_code_map, raw_code_map_element) {
354            (None, None) => None,
355            (value, element) => Some(path.with("codeMap", |path| {
356                super::super::codec::Primitive::from_json_parts(value, element, path)
357            })?),
358        };
359        let field_offsets = match (raw_offsets, raw_offsets_element) {
360            (None, None) => None,
361            (value, element) => Some(path.with("offsets", |path| {
362                super::super::codec::Primitive::from_json_parts(value, element, path)
363            })?),
364        };
365        let field_data = match (raw_data, raw_data_element) {
366            (None, None) => None,
367            (value, element) => Some(path.with("data", |path| {
368                super::super::codec::Primitive::from_json_parts(value, element, path)
369            })?),
370        };
371        Ok(Self {
372            id: field_id,
373            extension: field_extension,
374            origin: field_origin,
375            interval: field_interval,
376            interval_unit: field_interval_unit,
377            factor: field_factor,
378            lower_limit: field_lower_limit,
379            upper_limit: field_upper_limit,
380            dimensions: field_dimensions,
381            code_map: field_code_map,
382            offsets: field_offsets,
383            data: field_data,
384        })
385    }
386}
387
388impl serde::Serialize for SampledData {
389    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
390        let mut map = serde::Serializer::serialize_map(serializer, None)?;
391        if let Some(item) = &self.code_map {
392            super::super::codec::element_entry(&mut map, "_codeMap", item)?;
393        }
394        if let Some(item) = &self.data {
395            super::super::codec::element_entry(&mut map, "_data", item)?;
396        }
397        super::super::codec::element_entry(&mut map, "_dimensions", &self.dimensions)?;
398        if let Some(item) = &self.factor {
399            super::super::codec::element_entry(&mut map, "_factor", item)?;
400        }
401        if let Some(item) = &self.interval {
402            super::super::codec::element_entry(&mut map, "_interval", item)?;
403        }
404        super::super::codec::element_entry(&mut map, "_intervalUnit", &self.interval_unit)?;
405        if let Some(item) = &self.lower_limit {
406            super::super::codec::element_entry(&mut map, "_lowerLimit", item)?;
407        }
408        if let Some(item) = &self.offsets {
409            super::super::codec::element_entry(&mut map, "_offsets", item)?;
410        }
411        if let Some(item) = &self.upper_limit {
412            super::super::codec::element_entry(&mut map, "_upperLimit", item)?;
413        }
414        if let Some(item) = &self.code_map {
415            super::super::codec::value_entry(&mut map, "codeMap", item)?;
416        }
417        if let Some(item) = &self.data {
418            super::super::codec::value_entry(&mut map, "data", item)?;
419        }
420        super::super::codec::value_entry(&mut map, "dimensions", &self.dimensions)?;
421        if !self.extension.is_empty() {
422            serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
423        }
424        if let Some(item) = &self.factor {
425            super::super::codec::value_entry(&mut map, "factor", item)?;
426        }
427        if let Some(v) = &self.id {
428            serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
429        }
430        if let Some(item) = &self.interval {
431            super::super::codec::value_entry(&mut map, "interval", item)?;
432        }
433        super::super::codec::value_entry(&mut map, "intervalUnit", &self.interval_unit)?;
434        if let Some(item) = &self.lower_limit {
435            super::super::codec::value_entry(&mut map, "lowerLimit", item)?;
436        }
437        if let Some(item) = &self.offsets {
438            super::super::codec::value_entry(&mut map, "offsets", item)?;
439        }
440        serde::ser::SerializeMap::serialize_entry(&mut map, "origin", &self.origin)?;
441        if let Some(item) = &self.upper_limit {
442            super::super::codec::value_entry(&mut map, "upperLimit", item)?;
443        }
444        serde::ser::SerializeMap::end(map)
445    }
446}
447
448impl<'de> serde::Deserialize<'de> for SampledData {
449    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
450        let value = <super::super::codec::Value as serde::Deserialize>::deserialize(deserializer)?;
451        let mut path = super::super::codec::Path::root("SampledData");
452        let object =
453            super::super::codec::expect_object(&value, &path).map_err(serde::de::Error::custom)?;
454        super::super::codec::Json::from_json(object, &mut path).map_err(serde::de::Error::custom)
455    }
456}