1#[derive(Debug, Clone, Default, PartialEq, Eq)]
12pub struct SampledData {
13 pub id: Option<std::string::String>,
18 pub extension: Vec<super::extension::Extension>,
27 pub origin: super::quantity::Quantity,
32 pub interval: Option<super::primitives::Decimal>,
38 pub interval_unit: super::primitives::Code,
42 pub factor: Option<super::primitives::Decimal>,
47 pub lower_limit: Option<super::primitives::Decimal>,
55 pub upper_limit: Option<super::primitives::Decimal>,
63 pub dimensions: super::primitives::PositiveInt,
69 pub code_map: Option<super::primitives::Canonical>,
73 pub offsets: Option<super::primitives::String>,
83 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}