use fhir_types::r4::element_definition::ElementDefinition;
use crate::report::Constraint;
use crate::report::Reason;
use crate::validate::structure::Structure;
use crate::validate::walk::Walk;
impl Walk<'_, '_, '_> {
pub(crate) fn list(
&mut self,
structure: &Structure,
id: &str,
element: &ElementDefinition,
location: &str,
) {
let url = structure.url();
for constraint in &element.constraint {
self.out().unevaluated(
url,
id,
Constraint::Invariant {
key: constraint.key.value.clone().unwrap_or_default(),
severity: constraint.severity.value.clone().unwrap_or_default(),
},
location,
Reason::Invariants,
);
}
if let Some(binding) = &element.binding {
let strength = binding.strength.value.clone().unwrap_or_default();
if strength != "example" {
self.out().unevaluated(
url,
id,
Constraint::Binding {
strength,
value_set: binding.value_set.as_ref().and_then(|set| set.value.clone()),
},
location,
Reason::Bindings,
);
}
}
for kind in &element.r#type {
let targets: Vec<String> = kind
.target_profile
.iter()
.filter_map(|profile| profile.value.clone())
.collect();
if !targets.is_empty() {
self.out().unevaluated(
url,
id,
Constraint::TargetProfile { profiles: targets },
location,
Reason::Profiles,
);
}
}
}
}