// @generated by fhir-codegen from hl7.fhir.r4.core 4.0.1. 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/R4/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::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::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::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::Contributor(_) => 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::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::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::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::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::Contributor(_) => 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::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: item.xpath.as_ref().and_then(|value| value.value.as_deref()), 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::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::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::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::Contributor(_) => 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::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.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.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()
}
}