Skip to main content

fhirkit/r4/resources/
specimen_definition.rs

1// @generated by fhirkit-gen from hl7.fhir.r4.core 4.0.1. Do not edit.
2//! The FHIR R4 `SpecimenDefinition` resource.
3
4#![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/// A kind of specimen with associated set of requirements.
19///
20/// FHIR path: `SpecimenDefinition`.
21#[cfg(feature = "specialized")]
22#[derive(Debug, Clone, PartialEq, Default)]
23pub struct SpecimenDefinition {
24    /// `id` (0..1): Logical id of this artifact
25    pub id: Option<String>,
26    /// `meta` (0..1): Metadata about the resource
27    pub meta: Option<Meta>,
28    /// `implicitRules` (0..1): A set of rules under which this content was created
29    pub implicit_rules: Option<Primitive<String>>,
30    /// `language` (0..1): Language of the resource content
31    pub language: Option<Primitive<String>>,
32    /// `text` (0..1): Text summary of the resource, for human interpretation
33    pub text: Option<Narrative>,
34    /// `contained` (0..*): Contained, inline Resources
35    pub contained: Vec<Resource>,
36    /// `extension` (0..*): Additional content defined by implementations
37    pub extension: Vec<Extension>,
38    /// `modifierExtension` (0..*): Extensions that cannot be ignored
39    pub modifier_extension: Vec<Extension>,
40    /// `identifier` (0..1): Business identifier of a kind of specimen
41    pub identifier: Option<Identifier>,
42    /// `typeCollected` (0..1): Kind of material to collect
43    pub type_collected: Option<CodeableConcept>,
44    /// `patientPreparation` (0..*): Patient preparation for collection
45    pub patient_preparation: Vec<CodeableConcept>,
46    /// `timeAspect` (0..1): Time aspect for collection
47    pub time_aspect: Option<Primitive<String>>,
48    /// `collection` (0..*): Specimen collection procedure
49    pub collection: Vec<CodeableConcept>,
50    /// `typeTested` (0..*): Specimen in container intended for testing by lab
51    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/// Specimen in container intended for testing by lab
103///
104/// FHIR path: `SpecimenDefinition.typeTested`.
105#[cfg(feature = "specialized")]
106#[derive(Debug, Clone, PartialEq, Default)]
107pub struct SpecimenDefinitionTypeTested {
108    /// `id` (0..1): Unique id for inter-element referencing
109    pub id: Option<String>,
110    /// `extension` (0..*): Additional content defined by implementations
111    pub extension: Vec<Extension>,
112    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
113    pub modifier_extension: Vec<Extension>,
114    /// `isDerived` (0..1): Primary or secondary specimen
115    pub is_derived: Option<Primitive<bool>>,
116    /// `type` (0..1): Type of intended specimen
117    pub type_: Option<CodeableConcept>,
118    /// `preference` (1..1): preferred | alternate
119    pub preference: Option<Primitive<String>>,
120    /// `container` (0..1): The specimen's container
121    pub container: Option<SpecimenDefinitionTypeTestedContainer>,
122    /// `requirement` (0..1): Specimen requirements
123    pub requirement: Option<Primitive<String>>,
124    /// `retentionTime` (0..1): Specimen retention time
125    pub retention_time: Option<Duration>,
126    /// `rejectionCriterion` (0..*): Rejection criterion
127    pub rejection_criterion: Vec<CodeableConcept>,
128    /// `handling` (0..*): Specimen handling before testing
129    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/// The specimen's container
174///
175/// FHIR path: `SpecimenDefinition.typeTested.container`.
176#[cfg(feature = "specialized")]
177#[derive(Debug, Clone, PartialEq, Default)]
178pub struct SpecimenDefinitionTypeTestedContainer {
179    /// `id` (0..1): Unique id for inter-element referencing
180    pub id: Option<String>,
181    /// `extension` (0..*): Additional content defined by implementations
182    pub extension: Vec<Extension>,
183    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
184    pub modifier_extension: Vec<Extension>,
185    /// `material` (0..1): Container material
186    pub material: Option<CodeableConcept>,
187    /// `type` (0..1): Kind of container associated with the kind of specimen
188    pub type_: Option<CodeableConcept>,
189    /// `cap` (0..1): Color of container cap
190    pub cap: Option<CodeableConcept>,
191    /// `description` (0..1): Container description
192    pub description: Option<Primitive<String>>,
193    /// `capacity` (0..1): Container capacity
194    pub capacity: Option<Quantity>,
195    /// `minimumVolume[x]` (0..1): Minimum volume
196    pub minimum_volume: Option<SpecimenDefinitionTypeTestedContainerMinimumVolume>,
197    /// `additive` (0..*): Additive associated with container
198    pub additive: Vec<SpecimenDefinitionTypeTestedContainerAdditive>,
199    /// `preparation` (0..1): Specimen container preparation
200    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/// Additive associated with container
244///
245/// FHIR path: `SpecimenDefinition.typeTested.container.additive`.
246#[cfg(feature = "specialized")]
247#[derive(Debug, Clone, PartialEq, Default)]
248pub struct SpecimenDefinitionTypeTestedContainerAdditive {
249    /// `id` (0..1): Unique id for inter-element referencing
250    pub id: Option<String>,
251    /// `extension` (0..*): Additional content defined by implementations
252    pub extension: Vec<Extension>,
253    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
254    pub modifier_extension: Vec<Extension>,
255    /// `additive[x]` (1..1): Additive associated with container
256    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/// Specimen handling before testing
287///
288/// FHIR path: `SpecimenDefinition.typeTested.handling`.
289#[cfg(feature = "specialized")]
290#[derive(Debug, Clone, PartialEq, Default)]
291pub struct SpecimenDefinitionTypeTestedHandling {
292    /// `id` (0..1): Unique id for inter-element referencing
293    pub id: Option<String>,
294    /// `extension` (0..*): Additional content defined by implementations
295    pub extension: Vec<Extension>,
296    /// `modifierExtension` (0..*): Extensions that cannot be ignored even if unrecognized
297    pub modifier_extension: Vec<Extension>,
298    /// `temperatureQualifier` (0..1): Temperature qualifier
299    pub temperature_qualifier: Option<CodeableConcept>,
300    /// `temperatureRange` (0..1): Temperature range
301    pub temperature_range: Option<Range>,
302    /// `maxDuration` (0..1): Maximum preservation time
303    pub max_duration: Option<Duration>,
304    /// `instruction` (0..1): Preservation instruction
305    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/// The types `SpecimenDefinition.typeTested.container.minimumVolume[x]` allows.
341#[cfg(feature = "specialized")]
342#[derive(Debug, Clone, PartialEq)]
343pub enum SpecimenDefinitionTypeTestedContainerMinimumVolume {
344    /// `Quantity`
345    Quantity(Quantity),
346    /// `string`
347    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/// The types `SpecimenDefinition.typeTested.container.additive.additive[x]` allows.
371#[cfg(feature = "specialized")]
372#[derive(Debug, Clone, PartialEq)]
373pub enum SpecimenDefinitionTypeTestedContainerAdditiveAdditive {
374    /// `CodeableConcept`
375    CodeableConcept(CodeableConcept),
376    /// `Reference`
377    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}