Skip to main content

fhir_types/r6/
sampled_data.rs

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