fhir-types 0.1.126

Generated per-version FHIR types and terminology operation contracts
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
// @generated by fhir-codegen from hl7.fhir.r6.core 6.0.0-ballot5. DO NOT EDIT.
// Change the emitter (tools/fhir-codegen) and regenerate.
// SPDX-FileCopyrightText: Cadasto B.V.
// SPDX-License-Identifier: Apache-2.0
//! The release-neutral read of this version's `ElementDefinition`, emitted from
//! its package (<https://hl7.org/fhir/R6/elementdefinition.html>).

/// The extensions stating a primitive type's lexical form: `regex` from R4,
/// `structuredefinition-regex` in STU3.
const LEXICAL_FORMS: [&str; 2] = [
    "http://hl7.org/fhir/StructureDefinition/regex",
    "http://hl7.org/fhir/StructureDefinition/structuredefinition-regex",
];

#[expect(
    clippy::match_same_arms,
    reason = "an extension value is read by one arm per type the version admits, and every arm of a type that cannot carry the fact reads as absent"
)]
impl super::super::definition::ElementDefinitionRead
    for super::element_definition::ElementDefinition
{
    fn element_id(&self) -> Option<&str> {
        self.id.as_deref()
    }

    fn path(&self) -> Option<&str> {
        self.path.value.as_deref()
    }

    fn slice_name(&self) -> Option<&str> {
        self.slice_name
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn min(&self) -> Option<u32> {
        self.min.as_ref().and_then(|value| value.value)
    }

    fn max(&self) -> Option<&str> {
        self.max.as_ref().and_then(|value| value.value.as_deref())
    }

    fn max_length(&self) -> Option<i32> {
        self.max_length.as_ref().and_then(|value| value.value)
    }

    fn is_modifier(&self) -> Option<bool> {
        self.is_modifier.as_ref().and_then(|value| value.value)
    }

    fn content_reference(&self) -> Option<&str> {
        self.content_reference
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn types(&self) -> Vec<super::super::definition::TypeRead<'_>> {
        self.r#type
            .iter()
            .map(|item| super::super::definition::TypeRead {
                code: item.code.value.as_deref(),
                profiles: item
                    .profile
                    .iter()
                    .filter_map(|value| value.value.as_deref())
                    .collect(),
                target_profiles: item
                    .target_profile
                    .iter()
                    .filter_map(|value| value.value.as_deref())
                    .collect(),
                aggregation: item
                    .aggregation
                    .iter()
                    .filter_map(|value| value.value.as_deref())
                    .collect(),
                versioning: item
                    .versioning
                    .as_ref()
                    .and_then(|value| value.value.as_deref()),
                regex: item
                    .extension
                    .iter()
                    .filter(|extension| {
                        Some(extension.url.as_str()).is_some_and(|url| LEXICAL_FORMS.contains(&url))
                    })
                    .find_map(|extension| {
                        extension.value.as_ref().and_then(|value| match &value {
                            super::extension::ExtensionValue::Base64Binary(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Boolean(_) => None,
                            super::extension::ExtensionValue::Canonical(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Code(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Date(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::DateTime(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Decimal(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Id(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Instant(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Integer(_) => None,
                            super::extension::ExtensionValue::Integer64(_) => None,
                            super::extension::ExtensionValue::Markdown(held) => {
                                held.value.as_deref()
                            }
                            super::extension::ExtensionValue::Oid(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::PositiveInt(_) => None,
                            super::extension::ExtensionValue::String(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Time(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::UnsignedInt(_) => None,
                            super::extension::ExtensionValue::Uri(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Url(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Uuid(held) => held.value.as_deref(),
                            super::extension::ExtensionValue::Address(_) => None,
                            super::extension::ExtensionValue::Age(_) => None,
                            super::extension::ExtensionValue::Annotation(_) => None,
                            super::extension::ExtensionValue::Attachment(_) => None,
                            super::extension::ExtensionValue::CodeableConcept(_) => None,
                            super::extension::ExtensionValue::CodeableReference(_) => None,
                            super::extension::ExtensionValue::Coding(_) => None,
                            super::extension::ExtensionValue::ContactPoint(_) => None,
                            super::extension::ExtensionValue::Count(_) => None,
                            super::extension::ExtensionValue::Distance(_) => None,
                            super::extension::ExtensionValue::Duration(_) => None,
                            super::extension::ExtensionValue::HumanName(_) => None,
                            super::extension::ExtensionValue::Identifier(_) => None,
                            super::extension::ExtensionValue::Money(_) => None,
                            super::extension::ExtensionValue::Period(_) => None,
                            super::extension::ExtensionValue::Quantity(_) => None,
                            super::extension::ExtensionValue::Range(_) => None,
                            super::extension::ExtensionValue::Ratio(_) => None,
                            super::extension::ExtensionValue::RatioRange(_) => None,
                            super::extension::ExtensionValue::Reference(held) => held
                                .reference
                                .as_ref()
                                .and_then(|value| value.value.as_deref()),
                            super::extension::ExtensionValue::SampledData(_) => None,
                            super::extension::ExtensionValue::Signature(_) => None,
                            super::extension::ExtensionValue::Timing(_) => None,
                            super::extension::ExtensionValue::ContactDetail(_) => None,
                            super::extension::ExtensionValue::DataRequirement(_) => None,
                            super::extension::ExtensionValue::Expression(_) => None,
                            super::extension::ExtensionValue::ParameterDefinition(_) => None,
                            super::extension::ExtensionValue::RelatedArtifact(_) => None,
                            super::extension::ExtensionValue::TriggerDefinition(_) => None,
                            super::extension::ExtensionValue::UsageContext(_) => None,
                            super::extension::ExtensionValue::Availability(_) => None,
                            super::extension::ExtensionValue::ExtendedContactDetail(_) => None,
                            super::extension::ExtensionValue::VirtualServiceDetail(_) => None,
                            super::extension::ExtensionValue::Dosage(_) => None,
                            super::extension::ExtensionValue::Meta(_) => None,
                        })
                    }),
            })
            .collect()
    }

    fn binding(&self) -> Option<super::super::definition::BindingRead<'_>> {
        self.binding.as_ref().map(|item| super::super::definition::BindingRead { strength: item.strength.value.as_deref(), value_set: item.value_set.as_ref().and_then(|value| value.value.as_deref()), max_value_set: item.extension.iter().filter(|extension| Some(extension.url.as_str()) == Some("http://hl7.org/fhir/StructureDefinition/elementdefinition-maxValueSet")).find_map(|extension| extension.value.as_ref().and_then(|value| match &value { super::extension::ExtensionValue::Base64Binary(held) => held.value.as_deref(), super::extension::ExtensionValue::Boolean(_) => None, super::extension::ExtensionValue::Canonical(held) => held.value.as_deref(), super::extension::ExtensionValue::Code(held) => held.value.as_deref(), super::extension::ExtensionValue::Date(held) => held.value.as_deref(), super::extension::ExtensionValue::DateTime(held) => held.value.as_deref(), super::extension::ExtensionValue::Decimal(held) => held.value.as_deref(), super::extension::ExtensionValue::Id(held) => held.value.as_deref(), super::extension::ExtensionValue::Instant(held) => held.value.as_deref(), super::extension::ExtensionValue::Integer(_) => None, super::extension::ExtensionValue::Integer64(_) => None, super::extension::ExtensionValue::Markdown(held) => held.value.as_deref(), super::extension::ExtensionValue::Oid(held) => held.value.as_deref(), super::extension::ExtensionValue::PositiveInt(_) => None, super::extension::ExtensionValue::String(held) => held.value.as_deref(), super::extension::ExtensionValue::Time(held) => held.value.as_deref(), super::extension::ExtensionValue::UnsignedInt(_) => None, super::extension::ExtensionValue::Uri(held) => held.value.as_deref(), super::extension::ExtensionValue::Url(held) => held.value.as_deref(), super::extension::ExtensionValue::Uuid(held) => held.value.as_deref(), super::extension::ExtensionValue::Address(_) => None, super::extension::ExtensionValue::Age(_) => None, super::extension::ExtensionValue::Annotation(_) => None, super::extension::ExtensionValue::Attachment(_) => None, super::extension::ExtensionValue::CodeableConcept(_) => None, super::extension::ExtensionValue::CodeableReference(_) => None, super::extension::ExtensionValue::Coding(_) => None, super::extension::ExtensionValue::ContactPoint(_) => None, super::extension::ExtensionValue::Count(_) => None, super::extension::ExtensionValue::Distance(_) => None, super::extension::ExtensionValue::Duration(_) => None, super::extension::ExtensionValue::HumanName(_) => None, super::extension::ExtensionValue::Identifier(_) => None, super::extension::ExtensionValue::Money(_) => None, super::extension::ExtensionValue::Period(_) => None, super::extension::ExtensionValue::Quantity(_) => None, super::extension::ExtensionValue::Range(_) => None, super::extension::ExtensionValue::Ratio(_) => None, super::extension::ExtensionValue::RatioRange(_) => None, super::extension::ExtensionValue::Reference(held) => held.reference.as_ref().and_then(|value| value.value.as_deref()), super::extension::ExtensionValue::SampledData(_) => None, super::extension::ExtensionValue::Signature(_) => None, super::extension::ExtensionValue::Timing(_) => None, super::extension::ExtensionValue::ContactDetail(_) => None, super::extension::ExtensionValue::DataRequirement(_) => None, super::extension::ExtensionValue::Expression(_) => None, super::extension::ExtensionValue::ParameterDefinition(_) => None, super::extension::ExtensionValue::RelatedArtifact(_) => None, super::extension::ExtensionValue::TriggerDefinition(_) => None, super::extension::ExtensionValue::UsageContext(_) => None, super::extension::ExtensionValue::Availability(_) => None, super::extension::ExtensionValue::ExtendedContactDetail(_) => None, super::extension::ExtensionValue::VirtualServiceDetail(_) => None, super::extension::ExtensionValue::Dosage(_) => None, super::extension::ExtensionValue::Meta(_) => None, })) })
    }

    fn constraints(&self) -> Vec<super::super::definition::ConstraintRead<'_>> {
        self.constraint.iter().map(|item| super::super::definition::ConstraintRead { key: item.key.value.as_deref(), severity: item.severity.value.as_deref(), human: item.human.value.as_deref(), expression: item.expression.as_ref().and_then(|value| value.value.as_deref()), xpath: None, source: item.source.as_ref().and_then(|value| value.value.as_deref()), best_practice: item.extension.iter().filter(|extension| Some(extension.url.as_str()) == Some("http://hl7.org/fhir/StructureDefinition/elementdefinition-bestpractice")).find_map(|extension| extension.value.as_ref().and_then(|value| match &value { super::extension::ExtensionValue::Base64Binary(_) => None, super::extension::ExtensionValue::Boolean(held) => held.value, super::extension::ExtensionValue::Canonical(_) => None, super::extension::ExtensionValue::Code(_) => None, super::extension::ExtensionValue::Date(_) => None, super::extension::ExtensionValue::DateTime(_) => None, super::extension::ExtensionValue::Decimal(_) => None, super::extension::ExtensionValue::Id(_) => None, super::extension::ExtensionValue::Instant(_) => None, super::extension::ExtensionValue::Integer(_) => None, super::extension::ExtensionValue::Integer64(_) => None, super::extension::ExtensionValue::Markdown(_) => None, super::extension::ExtensionValue::Oid(_) => None, super::extension::ExtensionValue::PositiveInt(_) => None, super::extension::ExtensionValue::String(_) => None, super::extension::ExtensionValue::Time(_) => None, super::extension::ExtensionValue::UnsignedInt(_) => None, super::extension::ExtensionValue::Uri(_) => None, super::extension::ExtensionValue::Url(_) => None, super::extension::ExtensionValue::Uuid(_) => None, super::extension::ExtensionValue::Address(_) => None, super::extension::ExtensionValue::Age(_) => None, super::extension::ExtensionValue::Annotation(_) => None, super::extension::ExtensionValue::Attachment(_) => None, super::extension::ExtensionValue::CodeableConcept(_) => None, super::extension::ExtensionValue::CodeableReference(_) => None, super::extension::ExtensionValue::Coding(_) => None, super::extension::ExtensionValue::ContactPoint(_) => None, super::extension::ExtensionValue::Count(_) => None, super::extension::ExtensionValue::Distance(_) => None, super::extension::ExtensionValue::Duration(_) => None, super::extension::ExtensionValue::HumanName(_) => None, super::extension::ExtensionValue::Identifier(_) => None, super::extension::ExtensionValue::Money(_) => None, super::extension::ExtensionValue::Period(_) => None, super::extension::ExtensionValue::Quantity(_) => None, super::extension::ExtensionValue::Range(_) => None, super::extension::ExtensionValue::Ratio(_) => None, super::extension::ExtensionValue::RatioRange(_) => None, super::extension::ExtensionValue::Reference(_) => None, super::extension::ExtensionValue::SampledData(_) => None, super::extension::ExtensionValue::Signature(_) => None, super::extension::ExtensionValue::Timing(_) => None, super::extension::ExtensionValue::ContactDetail(_) => None, super::extension::ExtensionValue::DataRequirement(_) => None, super::extension::ExtensionValue::Expression(_) => None, super::extension::ExtensionValue::ParameterDefinition(_) => None, super::extension::ExtensionValue::RelatedArtifact(_) => None, super::extension::ExtensionValue::TriggerDefinition(_) => None, super::extension::ExtensionValue::UsageContext(_) => None, super::extension::ExtensionValue::Availability(_) => None, super::extension::ExtensionValue::ExtendedContactDetail(_) => None, super::extension::ExtensionValue::VirtualServiceDetail(_) => None, super::extension::ExtensionValue::Dosage(_) => None, super::extension::ExtensionValue::Meta(_) => None, })) }).collect()
    }

    fn slicing(&self) -> Option<super::super::definition::SlicingRead<'_>> {
        self.slicing
            .as_ref()
            .map(|item| super::super::definition::SlicingRead {
                discriminators: item
                    .discriminator
                    .iter()
                    .map(|item| super::super::definition::DiscriminatorRead {
                        kind: item.r#type.value.as_deref(),
                        path: item.path.value.as_deref(),
                    })
                    .collect(),
                description: item
                    .description
                    .as_ref()
                    .and_then(|value| value.value.as_deref()),
                ordered: item.ordered.as_ref().and_then(|value| value.value),
                rules: item.rules.value.as_deref(),
            })
    }

    fn fixed(
        &self,
    ) -> Result<Option<super::super::definition::ChoiceValue>, super::super::codec::EncodeError>
    {
        self.fixed
            .as_ref()
            .map(|value| {
                value.to_json_parts().map(|(suffix, value, element)| {
                    super::super::definition::ChoiceValue {
                        suffix,
                        value,
                        element,
                    }
                })
            })
            .transpose()
    }

    fn pattern(
        &self,
    ) -> Result<Option<super::super::definition::ChoiceValue>, super::super::codec::EncodeError>
    {
        self.pattern
            .as_ref()
            .map(|value| {
                value.to_json_parts().map(|(suffix, value, element)| {
                    super::super::definition::ChoiceValue {
                        suffix,
                        value,
                        element,
                    }
                })
            })
            .transpose()
    }
}

#[cfg(feature = "resources")]
impl super::super::definition::StructureDefinitionRead
    for super::structure_definition::StructureDefinition
{
    type Element = super::element_definition::ElementDefinition;

    fn url(&self) -> Option<&str> {
        self.url.value.as_deref()
    }

    fn version(&self) -> Option<&str> {
        self.version
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn type_name(&self) -> Option<&str> {
        self.r#type.value.as_deref()
    }

    fn base_definition(&self) -> Option<&str> {
        self.base_definition
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn kind(&self) -> Option<&str> {
        self.kind.value.as_deref()
    }

    fn derivation(&self) -> Option<&str> {
        self.derivation
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn is_abstract(&self) -> Option<bool> {
        self.r#abstract.value
    }

    fn snapshot(&self) -> Option<&[Self::Element]> {
        self.snapshot.as_ref().map(|item| item.element.as_slice())
    }

    fn contexts(&self) -> Vec<super::super::definition::ContextRead<'_>> {
        self.context
            .iter()
            .map(|item| super::super::definition::ContextRead {
                kind: item.r#type.value.as_deref(),
                expression: item.expression.value.as_deref(),
            })
            .collect()
    }

    fn context_invariants(&self) -> Vec<&str> {
        self.context_invariant
            .iter()
            .filter_map(|value| value.value.as_deref())
            .collect()
    }
}

#[cfg(feature = "terminology")]
impl super::super::definition::ValueSetRead for super::value_set::ValueSet {
    type Contains = super::value_set::ValueSetExpansionContains;

    fn compose(&self) -> Option<super::super::definition::ComposeRead<'_>> {
        self.compose
            .as_ref()
            .map(|item| super::super::definition::ComposeRead {
                inactive: item.inactive.as_ref().and_then(|value| value.value),
                includes: item
                    .include
                    .iter()
                    .map(|item| super::super::definition::IncludeRead {
                        system: item
                            .system
                            .as_ref()
                            .and_then(|value| value.value.as_deref()),
                        version: item
                            .version
                            .as_ref()
                            .and_then(|value| value.value.as_deref()),
                        concepts: item
                            .concept
                            .iter()
                            .filter_map(|item| item.code.value.as_deref())
                            .collect(),
                        filters: item
                            .filter
                            .iter()
                            .map(|item| super::super::definition::FilterRead {
                                property: item.property.value.as_deref(),
                                op: item.op.value.as_deref(),
                                value: item.value.as_ref().and_then(|value| value.value.as_deref()),
                            })
                            .collect(),
                        value_sets: item
                            .value_set
                            .iter()
                            .filter_map(|value| value.value.as_deref())
                            .collect(),
                    })
                    .collect(),
                excludes: item
                    .exclude
                    .iter()
                    .map(|item| super::super::definition::IncludeRead {
                        system: item
                            .system
                            .as_ref()
                            .and_then(|value| value.value.as_deref()),
                        version: item
                            .version
                            .as_ref()
                            .and_then(|value| value.value.as_deref()),
                        concepts: item
                            .concept
                            .iter()
                            .filter_map(|item| item.code.value.as_deref())
                            .collect(),
                        filters: item
                            .filter
                            .iter()
                            .map(|item| super::super::definition::FilterRead {
                                property: item.property.value.as_deref(),
                                op: item.op.value.as_deref(),
                                value: item.value.as_ref().and_then(|value| value.value.as_deref()),
                            })
                            .collect(),
                        value_sets: item
                            .value_set
                            .iter()
                            .filter_map(|value| value.value.as_deref())
                            .collect(),
                    })
                    .collect(),
            })
    }

    fn expansion(&self) -> Option<super::super::definition::ExpansionRead<'_, Self::Contains>> {
        self.expansion
            .as_ref()
            .map(|item| super::super::definition::ExpansionRead {
                total: item.total.as_ref().and_then(|value| value.value),
                offset: item.offset.as_ref().and_then(|value| value.value),
                contains: item.contains.as_slice(),
            })
    }
}

#[cfg(feature = "terminology")]
impl super::super::definition::ContainsRead for super::value_set::ValueSetExpansionContains {
    fn system(&self) -> Option<&str> {
        self.system
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn version(&self) -> Option<&str> {
        self.version
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn code(&self) -> Option<&str> {
        self.code.as_ref().and_then(|value| value.value.as_deref())
    }

    fn is_abstract(&self) -> Option<bool> {
        self.r#abstract.as_ref().and_then(|value| value.value)
    }

    fn contains(&self) -> &[Self] {
        self.contains.as_slice()
    }
}

#[cfg(feature = "terminology")]
impl super::super::definition::CodeSystemRead for super::code_system::CodeSystem {
    type Concept = super::code_system::CodeSystemConcept;

    fn content(&self) -> Option<&str> {
        self.content.value.as_deref()
    }

    fn hierarchy_meaning(&self) -> Option<&str> {
        self.hierarchy_meaning
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn case_sensitive(&self) -> Option<bool> {
        self.case_sensitive.as_ref().and_then(|value| value.value)
    }

    fn properties(&self) -> Vec<super::super::definition::PropertyRead<'_>> {
        self.property
            .iter()
            .map(|item| super::super::definition::PropertyRead {
                code: item.code.value.as_deref(),
                uri: item.uri.as_ref().and_then(|value| value.value.as_deref()),
            })
            .collect()
    }

    fn concepts(&self) -> &[Self::Concept] {
        self.concept.as_slice()
    }
}

#[cfg(feature = "terminology")]
impl super::super::definition::ConceptRead for super::code_system::CodeSystemConcept {
    fn code(&self) -> Option<&str> {
        self.code.value.as_deref()
    }

    fn display(&self) -> Option<&str> {
        self.display
            .as_ref()
            .and_then(|value| value.value.as_deref())
    }

    fn designations(&self) -> Vec<&str> {
        self.designation
            .iter()
            .filter_map(|item| item.value.value.as_deref())
            .collect()
    }

    fn properties(
        &self,
    ) -> Result<
        Vec<super::super::definition::ConceptPropertyRead<'_>>,
        super::super::codec::EncodeError,
    > {
        self.property
            .iter()
            .map(|item| {
                Ok(super::super::definition::ConceptPropertyRead {
                    code: item.code.value.as_deref(),
                    value: item
                        .value
                        .to_json_parts()
                        .map(
                            |(suffix, value, element)| super::super::definition::ChoiceValue {
                                suffix,
                                value,
                                element,
                            },
                        )
                        .map(Some)?,
                })
            })
            .collect()
    }

    fn concepts(&self) -> &[Self] {
        self.concept.as_slice()
    }
}