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>,
37 pub interval_unit: super::primitives::Code,
41 pub factor: Option<super::primitives::Decimal>,
46 pub lower_limit: Option<super::primitives::Decimal>,
51 pub upper_limit: Option<super::primitives::Decimal>,
56 pub dimensions: super::primitives::PositiveInt,
62 pub code_map: Option<super::primitives::Canonical>,
66 pub offsets: Option<super::primitives::String>,
74 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}