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 period: super::primitives::Decimal,
36 pub factor: Option<super::primitives::Decimal>,
41 pub lower_limit: Option<super::primitives::Decimal>,
46 pub upper_limit: Option<super::primitives::Decimal>,
51 pub dimensions: super::primitives::PositiveInt,
57 pub data: super::primitives::String,
64}
65
66impl super::super::codec::Json for SampledData {
67 fn to_json(&self) -> Result<super::super::codec::Object, super::super::codec::EncodeError> {
68 let mut object = super::super::codec::Object::new();
69 if let Some(v) = &self.id {
70 object.insert(
71 std::string::String::from("id"),
72 super::super::codec::Value::String(v.clone()),
73 );
74 }
75 if !self.extension.is_empty() {
76 let mut items = Vec::with_capacity(self.extension.len());
77 for item in &self.extension {
78 items.push(super::super::codec::Value::Object(
79 super::super::codec::Json::to_json(item)?,
80 ));
81 }
82 object.insert(
83 std::string::String::from("extension"),
84 super::super::codec::Value::Array(items),
85 );
86 }
87 object.insert(
88 std::string::String::from("origin"),
89 super::super::codec::Value::Object(super::super::codec::Json::to_json(&self.origin)?),
90 );
91 if let Some(v) = super::super::codec::Primitive::value_json(&self.period)? {
92 object.insert(std::string::String::from("period"), v);
93 }
94 if let Some(e) = super::super::codec::Primitive::element_json(&self.period)? {
95 object.insert(std::string::String::from("_period"), e);
96 }
97 if let Some(item) = &self.factor {
98 if let Some(v) = super::super::codec::Primitive::value_json(item)? {
99 object.insert(std::string::String::from("factor"), v);
100 }
101 if let Some(e) = super::super::codec::Primitive::element_json(item)? {
102 object.insert(std::string::String::from("_factor"), e);
103 }
104 }
105 if let Some(item) = &self.lower_limit {
106 if let Some(v) = super::super::codec::Primitive::value_json(item)? {
107 object.insert(std::string::String::from("lowerLimit"), v);
108 }
109 if let Some(e) = super::super::codec::Primitive::element_json(item)? {
110 object.insert(std::string::String::from("_lowerLimit"), e);
111 }
112 }
113 if let Some(item) = &self.upper_limit {
114 if let Some(v) = super::super::codec::Primitive::value_json(item)? {
115 object.insert(std::string::String::from("upperLimit"), v);
116 }
117 if let Some(e) = super::super::codec::Primitive::element_json(item)? {
118 object.insert(std::string::String::from("_upperLimit"), e);
119 }
120 }
121 if let Some(v) = super::super::codec::Primitive::value_json(&self.dimensions)? {
122 object.insert(std::string::String::from("dimensions"), v);
123 }
124 if let Some(e) = super::super::codec::Primitive::element_json(&self.dimensions)? {
125 object.insert(std::string::String::from("_dimensions"), e);
126 }
127 if let Some(v) = super::super::codec::Primitive::value_json(&self.data)? {
128 object.insert(std::string::String::from("data"), v);
129 }
130 if let Some(e) = super::super::codec::Primitive::element_json(&self.data)? {
131 object.insert(std::string::String::from("_data"), e);
132 }
133 Ok(object)
134 }
135
136 fn from_json(
137 object: &super::super::codec::Object,
138 path: &mut super::super::codec::Path,
139 ) -> Result<Self, super::super::codec::DecodeError> {
140 let mut raw_id: Option<&super::super::codec::Value> = None;
141 let mut raw_extension: Option<&super::super::codec::Value> = None;
142 let mut raw_origin: Option<&super::super::codec::Value> = None;
143 let mut raw_period: Option<&super::super::codec::Value> = None;
144 let mut raw_period_element: Option<&super::super::codec::Value> = None;
145 let mut raw_factor: Option<&super::super::codec::Value> = None;
146 let mut raw_factor_element: Option<&super::super::codec::Value> = None;
147 let mut raw_lower_limit: Option<&super::super::codec::Value> = None;
148 let mut raw_lower_limit_element: Option<&super::super::codec::Value> = None;
149 let mut raw_upper_limit: Option<&super::super::codec::Value> = None;
150 let mut raw_upper_limit_element: Option<&super::super::codec::Value> = None;
151 let mut raw_dimensions: Option<&super::super::codec::Value> = None;
152 let mut raw_dimensions_element: Option<&super::super::codec::Value> = None;
153 let mut raw_data: Option<&super::super::codec::Value> = None;
154 let mut raw_data_element: Option<&super::super::codec::Value> = None;
155 for (key, value) in object {
156 match key.as_str() {
157 "id" => {
158 raw_id = Some(value);
159 }
160 "extension" => {
161 raw_extension = Some(value);
162 }
163 "origin" => {
164 raw_origin = Some(value);
165 }
166 "period" => {
167 raw_period = Some(value);
168 }
169 "_period" => {
170 raw_period_element = Some(value);
171 }
172 "factor" => {
173 raw_factor = Some(value);
174 }
175 "_factor" => {
176 raw_factor_element = Some(value);
177 }
178 "lowerLimit" => {
179 raw_lower_limit = Some(value);
180 }
181 "_lowerLimit" => {
182 raw_lower_limit_element = Some(value);
183 }
184 "upperLimit" => {
185 raw_upper_limit = Some(value);
186 }
187 "_upperLimit" => {
188 raw_upper_limit_element = Some(value);
189 }
190 "dimensions" => {
191 raw_dimensions = Some(value);
192 }
193 "_dimensions" => {
194 raw_dimensions_element = Some(value);
195 }
196 "data" => {
197 raw_data = Some(value);
198 }
199 "_data" => {
200 raw_data_element = Some(value);
201 }
202 other => {
203 return path.with(other, |path| {
204 Err(path.error(super::super::codec::DecodeErrorKind::UnknownProperty))
205 });
206 }
207 }
208 }
209 let field_id = raw_id
210 .map(|value| {
211 path.with("id", |path| {
212 let value = super::super::codec::expect_single(value, path)?;
213 super::super::codec::expect_string(value, path)
214 })
215 })
216 .transpose()?;
217 let mut field_extension = Vec::new();
218 if let Some(raw) = raw_extension {
219 for (index, value) in path
220 .with("extension", |path| {
221 super::super::codec::expect_array(raw, path)
222 })?
223 .iter()
224 .enumerate()
225 {
226 field_extension.push(path.with_index("extension", index, |path| {
227 super::super::codec::Json::from_json(
228 super::super::codec::expect_object(value, path)?,
229 path,
230 )
231 })?);
232 }
233 }
234 let field_origin = path.with("origin", |path| {
235 let value = raw_origin
236 .ok_or_else(|| path.error(super::super::codec::DecodeErrorKind::MissingProperty))?;
237 super::super::codec::Json::from_json(
238 super::super::codec::expect_object(
239 super::super::codec::expect_single(value, path)?,
240 path,
241 )?,
242 path,
243 )
244 })?;
245 let field_period = path.with("period", |path| {
246 super::super::codec::Primitive::from_json_parts(raw_period, raw_period_element, path)
247 })?;
248 let field_factor = match (raw_factor, raw_factor_element) {
249 (None, None) => None,
250 (value, element) => Some(path.with("factor", |path| {
251 super::super::codec::Primitive::from_json_parts(value, element, path)
252 })?),
253 };
254 let field_lower_limit = match (raw_lower_limit, raw_lower_limit_element) {
255 (None, None) => None,
256 (value, element) => Some(path.with("lowerLimit", |path| {
257 super::super::codec::Primitive::from_json_parts(value, element, path)
258 })?),
259 };
260 let field_upper_limit = match (raw_upper_limit, raw_upper_limit_element) {
261 (None, None) => None,
262 (value, element) => Some(path.with("upperLimit", |path| {
263 super::super::codec::Primitive::from_json_parts(value, element, path)
264 })?),
265 };
266 let field_dimensions = path.with("dimensions", |path| {
267 super::super::codec::Primitive::from_json_parts(
268 raw_dimensions,
269 raw_dimensions_element,
270 path,
271 )
272 })?;
273 let field_data = path.with("data", |path| {
274 super::super::codec::Primitive::from_json_parts(raw_data, raw_data_element, path)
275 })?;
276 Ok(Self {
277 id: field_id,
278 extension: field_extension,
279 origin: field_origin,
280 period: field_period,
281 factor: field_factor,
282 lower_limit: field_lower_limit,
283 upper_limit: field_upper_limit,
284 dimensions: field_dimensions,
285 data: field_data,
286 })
287 }
288}
289
290impl serde::Serialize for SampledData {
291 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
292 let mut map = serde::Serializer::serialize_map(serializer, None)?;
293 super::super::codec::element_entry(&mut map, "_data", &self.data)?;
294 super::super::codec::element_entry(&mut map, "_dimensions", &self.dimensions)?;
295 if let Some(item) = &self.factor {
296 super::super::codec::element_entry(&mut map, "_factor", item)?;
297 }
298 if let Some(item) = &self.lower_limit {
299 super::super::codec::element_entry(&mut map, "_lowerLimit", item)?;
300 }
301 super::super::codec::element_entry(&mut map, "_period", &self.period)?;
302 if let Some(item) = &self.upper_limit {
303 super::super::codec::element_entry(&mut map, "_upperLimit", item)?;
304 }
305 super::super::codec::value_entry(&mut map, "data", &self.data)?;
306 super::super::codec::value_entry(&mut map, "dimensions", &self.dimensions)?;
307 if !self.extension.is_empty() {
308 serde::ser::SerializeMap::serialize_entry(&mut map, "extension", &self.extension)?;
309 }
310 if let Some(item) = &self.factor {
311 super::super::codec::value_entry(&mut map, "factor", item)?;
312 }
313 if let Some(v) = &self.id {
314 serde::ser::SerializeMap::serialize_entry(&mut map, "id", v)?;
315 }
316 if let Some(item) = &self.lower_limit {
317 super::super::codec::value_entry(&mut map, "lowerLimit", item)?;
318 }
319 serde::ser::SerializeMap::serialize_entry(&mut map, "origin", &self.origin)?;
320 super::super::codec::value_entry(&mut map, "period", &self.period)?;
321 if let Some(item) = &self.upper_limit {
322 super::super::codec::value_entry(&mut map, "upperLimit", item)?;
323 }
324 serde::ser::SerializeMap::end(map)
325 }
326}
327
328impl<'de> serde::Deserialize<'de> for SampledData {
329 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
330 let value = <super::super::codec::Value as serde::Deserialize>::deserialize(deserializer)?;
331 let mut path = super::super::codec::Path::root("SampledData");
332 let object =
333 super::super::codec::expect_object(&value, &path).map_err(serde::de::Error::custom)?;
334 super::super::codec::Json::from_json(object, &mut path).map_err(serde::de::Error::custom)
335 }
336}