1#![allow(
5 unused_imports,
6 clippy::large_enum_variant,
7 clippy::too_many_lines,
8 clippy::doc_markdown
9)]
10
11use crate::decode::{
12 choice_key, required, required_list, resource_type, Choice, Decoder, FhirJson, Obj, ObjWriter,
13};
14use crate::json::Json;
15use crate::primitive::{Decimal, Kind, Primitive};
16use crate::r4::*;
17
18#[cfg(feature = "specialized")]
22#[derive(Debug, Clone, PartialEq, Default)]
23pub struct SpecimenDefinition {
24 pub id: Option<String>,
26 pub meta: Option<Meta>,
28 pub implicit_rules: Option<Primitive<String>>,
30 pub language: Option<Primitive<String>>,
32 pub text: Option<Narrative>,
34 pub contained: Vec<Resource>,
36 pub extension: Vec<Extension>,
38 pub modifier_extension: Vec<Extension>,
40 pub identifier: Option<Identifier>,
42 pub type_collected: Option<CodeableConcept>,
44 pub patient_preparation: Vec<CodeableConcept>,
46 pub time_aspect: Option<Primitive<String>>,
48 pub collection: Vec<CodeableConcept>,
50 pub type_tested: Vec<SpecimenDefinitionTypeTested>,
52}
53
54#[cfg(feature = "specialized")]
55impl FhirJson for SpecimenDefinition {
56 const TYPE_NAME: &'static str = "SpecimenDefinition";
57
58 fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
59 let mut o = Obj::new(v, d)?;
60 resource_type(&mut o, d, "SpecimenDefinition");
61 let r = SpecimenDefinition {
62 id: o.string(d, "id"),
63 meta: o.one(d, "meta"),
64 implicit_rules: o.prim(d, "implicitRules", Kind::Uri),
65 language: o.prim(d, "language", Kind::Code),
66 text: o.one(d, "text"),
67 contained: o.list(d, "contained"),
68 extension: o.list(d, "extension"),
69 modifier_extension: o.list(d, "modifierExtension"),
70 identifier: o.one(d, "identifier"),
71 type_collected: o.one(d, "typeCollected"),
72 patient_preparation: o.list(d, "patientPreparation"),
73 time_aspect: o.prim(d, "timeAspect", Kind::String),
74 collection: o.list(d, "collection"),
75 type_tested: o.list(d, "typeTested"),
76 };
77 o.finish(d);
78 Some(r)
79 }
80
81 fn encode(&self) -> Json {
82 let mut w = ObjWriter::new();
83 w.raw("resourceType", Json::String("SpecimenDefinition".into()));
84 w.string("id", &self.id);
85 w.one("meta", &self.meta);
86 w.prim("implicitRules", &self.implicit_rules);
87 w.prim("language", &self.language);
88 w.one("text", &self.text);
89 w.list("contained", &self.contained);
90 w.list("extension", &self.extension);
91 w.list("modifierExtension", &self.modifier_extension);
92 w.one("identifier", &self.identifier);
93 w.one("typeCollected", &self.type_collected);
94 w.list("patientPreparation", &self.patient_preparation);
95 w.prim("timeAspect", &self.time_aspect);
96 w.list("collection", &self.collection);
97 w.list("typeTested", &self.type_tested);
98 w.finish()
99 }
100}
101
102#[cfg(feature = "specialized")]
106#[derive(Debug, Clone, PartialEq, Default)]
107pub struct SpecimenDefinitionTypeTested {
108 pub id: Option<String>,
110 pub extension: Vec<Extension>,
112 pub modifier_extension: Vec<Extension>,
114 pub is_derived: Option<Primitive<bool>>,
116 pub type_: Option<CodeableConcept>,
118 pub preference: Option<Primitive<String>>,
120 pub container: Option<SpecimenDefinitionTypeTestedContainer>,
122 pub requirement: Option<Primitive<String>>,
124 pub retention_time: Option<Duration>,
126 pub rejection_criterion: Vec<CodeableConcept>,
128 pub handling: Vec<SpecimenDefinitionTypeTestedHandling>,
130}
131
132#[cfg(feature = "specialized")]
133impl FhirJson for SpecimenDefinitionTypeTested {
134 const TYPE_NAME: &'static str = "SpecimenDefinitionTypeTested";
135
136 fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
137 let mut o = Obj::new(v, d)?;
138 let r = SpecimenDefinitionTypeTested {
139 id: o.string(d, "id"),
140 extension: o.list(d, "extension"),
141 modifier_extension: o.list(d, "modifierExtension"),
142 is_derived: o.prim(d, "isDerived", Kind::Boolean),
143 type_: o.one(d, "type"),
144 preference: o.prim(d, "preference", Kind::Code),
145 container: o.one(d, "container"),
146 requirement: o.prim(d, "requirement", Kind::String),
147 retention_time: o.one(d, "retentionTime"),
148 rejection_criterion: o.list(d, "rejectionCriterion"),
149 handling: o.list(d, "handling"),
150 };
151 required(d, "preference", &r.preference);
152 o.finish(d);
153 Some(r)
154 }
155
156 fn encode(&self) -> Json {
157 let mut w = ObjWriter::new();
158 w.string("id", &self.id);
159 w.list("extension", &self.extension);
160 w.list("modifierExtension", &self.modifier_extension);
161 w.prim("isDerived", &self.is_derived);
162 w.one("type", &self.type_);
163 w.prim("preference", &self.preference);
164 w.one("container", &self.container);
165 w.prim("requirement", &self.requirement);
166 w.one("retentionTime", &self.retention_time);
167 w.list("rejectionCriterion", &self.rejection_criterion);
168 w.list("handling", &self.handling);
169 w.finish()
170 }
171}
172
173#[cfg(feature = "specialized")]
177#[derive(Debug, Clone, PartialEq, Default)]
178pub struct SpecimenDefinitionTypeTestedContainer {
179 pub id: Option<String>,
181 pub extension: Vec<Extension>,
183 pub modifier_extension: Vec<Extension>,
185 pub material: Option<CodeableConcept>,
187 pub type_: Option<CodeableConcept>,
189 pub cap: Option<CodeableConcept>,
191 pub description: Option<Primitive<String>>,
193 pub capacity: Option<Quantity>,
195 pub minimum_volume: Option<SpecimenDefinitionTypeTestedContainerMinimumVolume>,
197 pub additive: Vec<SpecimenDefinitionTypeTestedContainerAdditive>,
199 pub preparation: Option<Primitive<String>>,
201}
202
203#[cfg(feature = "specialized")]
204impl FhirJson for SpecimenDefinitionTypeTestedContainer {
205 const TYPE_NAME: &'static str = "SpecimenDefinitionTypeTestedContainer";
206
207 fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
208 let mut o = Obj::new(v, d)?;
209 let r = SpecimenDefinitionTypeTestedContainer {
210 id: o.string(d, "id"),
211 extension: o.list(d, "extension"),
212 modifier_extension: o.list(d, "modifierExtension"),
213 material: o.one(d, "material"),
214 type_: o.one(d, "type"),
215 cap: o.one(d, "cap"),
216 description: o.prim(d, "description", Kind::String),
217 capacity: o.one(d, "capacity"),
218 minimum_volume: o.choice(d, "minimumVolume"),
219 additive: o.list(d, "additive"),
220 preparation: o.prim(d, "preparation", Kind::String),
221 };
222 o.finish(d);
223 Some(r)
224 }
225
226 fn encode(&self) -> Json {
227 let mut w = ObjWriter::new();
228 w.string("id", &self.id);
229 w.list("extension", &self.extension);
230 w.list("modifierExtension", &self.modifier_extension);
231 w.one("material", &self.material);
232 w.one("type", &self.type_);
233 w.one("cap", &self.cap);
234 w.prim("description", &self.description);
235 w.one("capacity", &self.capacity);
236 w.choice("minimumVolume", &self.minimum_volume);
237 w.list("additive", &self.additive);
238 w.prim("preparation", &self.preparation);
239 w.finish()
240 }
241}
242
243#[cfg(feature = "specialized")]
247#[derive(Debug, Clone, PartialEq, Default)]
248pub struct SpecimenDefinitionTypeTestedContainerAdditive {
249 pub id: Option<String>,
251 pub extension: Vec<Extension>,
253 pub modifier_extension: Vec<Extension>,
255 pub additive: Option<SpecimenDefinitionTypeTestedContainerAdditiveAdditive>,
257}
258
259#[cfg(feature = "specialized")]
260impl FhirJson for SpecimenDefinitionTypeTestedContainerAdditive {
261 const TYPE_NAME: &'static str = "SpecimenDefinitionTypeTestedContainerAdditive";
262
263 fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
264 let mut o = Obj::new(v, d)?;
265 let r = SpecimenDefinitionTypeTestedContainerAdditive {
266 id: o.string(d, "id"),
267 extension: o.list(d, "extension"),
268 modifier_extension: o.list(d, "modifierExtension"),
269 additive: o.choice(d, "additive"),
270 };
271 required(d, "additive[x]", &r.additive);
272 o.finish(d);
273 Some(r)
274 }
275
276 fn encode(&self) -> Json {
277 let mut w = ObjWriter::new();
278 w.string("id", &self.id);
279 w.list("extension", &self.extension);
280 w.list("modifierExtension", &self.modifier_extension);
281 w.choice("additive", &self.additive);
282 w.finish()
283 }
284}
285
286#[cfg(feature = "specialized")]
290#[derive(Debug, Clone, PartialEq, Default)]
291pub struct SpecimenDefinitionTypeTestedHandling {
292 pub id: Option<String>,
294 pub extension: Vec<Extension>,
296 pub modifier_extension: Vec<Extension>,
298 pub temperature_qualifier: Option<CodeableConcept>,
300 pub temperature_range: Option<Range>,
302 pub max_duration: Option<Duration>,
304 pub instruction: Option<Primitive<String>>,
306}
307
308#[cfg(feature = "specialized")]
309impl FhirJson for SpecimenDefinitionTypeTestedHandling {
310 const TYPE_NAME: &'static str = "SpecimenDefinitionTypeTestedHandling";
311
312 fn decode(v: &Json, d: &mut Decoder) -> Option<Self> {
313 let mut o = Obj::new(v, d)?;
314 let r = SpecimenDefinitionTypeTestedHandling {
315 id: o.string(d, "id"),
316 extension: o.list(d, "extension"),
317 modifier_extension: o.list(d, "modifierExtension"),
318 temperature_qualifier: o.one(d, "temperatureQualifier"),
319 temperature_range: o.one(d, "temperatureRange"),
320 max_duration: o.one(d, "maxDuration"),
321 instruction: o.prim(d, "instruction", Kind::String),
322 };
323 o.finish(d);
324 Some(r)
325 }
326
327 fn encode(&self) -> Json {
328 let mut w = ObjWriter::new();
329 w.string("id", &self.id);
330 w.list("extension", &self.extension);
331 w.list("modifierExtension", &self.modifier_extension);
332 w.one("temperatureQualifier", &self.temperature_qualifier);
333 w.one("temperatureRange", &self.temperature_range);
334 w.one("maxDuration", &self.max_duration);
335 w.prim("instruction", &self.instruction);
336 w.finish()
337 }
338}
339
340#[cfg(feature = "specialized")]
342#[derive(Debug, Clone, PartialEq)]
343pub enum SpecimenDefinitionTypeTestedContainerMinimumVolume {
344 Quantity(Quantity),
346 String(Primitive<String>),
348}
349
350#[cfg(feature = "specialized")]
351impl Choice for SpecimenDefinitionTypeTestedContainerMinimumVolume {
352 const TYPES: &'static [&'static str] = &["Quantity", "string"];
353
354 fn decode_as(code: &str, key: &str, o: &mut Obj<'_>, d: &mut Decoder) -> Option<Self> {
355 match code {
356 "Quantity" => o.one(d, key).map(Self::Quantity),
357 "string" => o.prim(d, key, Kind::String).map(Self::String),
358 _ => None,
359 }
360 }
361
362 fn encode_into(&self, base: &str, w: &mut ObjWriter) {
363 match self {
364 Self::Quantity(v) => w.value(&choice_key(base, "Quantity"), v),
365 Self::String(v) => w.prim_value(&choice_key(base, "string"), v),
366 }
367 }
368}
369
370#[cfg(feature = "specialized")]
372#[derive(Debug, Clone, PartialEq)]
373pub enum SpecimenDefinitionTypeTestedContainerAdditiveAdditive {
374 CodeableConcept(CodeableConcept),
376 Reference(Reference),
378}
379
380#[cfg(feature = "specialized")]
381impl Choice for SpecimenDefinitionTypeTestedContainerAdditiveAdditive {
382 const TYPES: &'static [&'static str] = &["CodeableConcept", "Reference"];
383
384 fn decode_as(code: &str, key: &str, o: &mut Obj<'_>, d: &mut Decoder) -> Option<Self> {
385 match code {
386 "CodeableConcept" => o.one(d, key).map(Self::CodeableConcept),
387 "Reference" => o.one(d, key).map(Self::Reference),
388 _ => None,
389 }
390 }
391
392 fn encode_into(&self, base: &str, w: &mut ObjWriter) {
393 match self {
394 Self::CodeableConcept(v) => w.value(&choice_key(base, "CodeableConcept"), v),
395 Self::Reference(v) => w.value(&choice_key(base, "Reference"), v),
396 }
397 }
398}