use cimmodel::CimDataset;
use crate::Config;
fn uri_to_short_name(uri: &str) -> Option<&'static str> {
crate::cgmes_profile_index().0.iter().find(|(iri, _)| *iri == uri).map(|(_, code)| *code)
}
fn collect_profiles_from_type(dataset: &CimDataset, type_name: &str, seen: &mut std::collections::HashSet<&'static str>) {
for mrid in dataset.by_type.get(type_name).into_iter().flatten() {
let entry = match dataset.entries.get(mrid) { Some(e) => e, None => continue };
let Some(model) = crate::sparql::Fields::of_class(entry, type_name) else { continue };
for p in model.texts("Model.profile") {
let p = p.trim();
if !p.is_empty()
&& let Some(short) = uri_to_short_name(p) {
seen.insert(short);
}
}
}
}
pub fn detect_config(dataset: &CimDataset) -> Config {
let mut seen: std::collections::HashSet<&'static str> = std::collections::HashSet::new();
collect_profiles_from_type(dataset, "FullModel", &mut seen);
collect_profiles_from_type(dataset, "DifferenceModel", &mut seen);
for iri in conforms_to(dataset) {
if let Some(short) = uri_to_short_name(iri.trim()) {
seen.insert(short);
}
}
let mut profiles: Vec<String> = seen.iter().map(|s| s.to_string()).collect();
profiles.sort();
let is_solved = seen.contains("SV");
Config {
profiles,
solved: is_solved,
not_solved: !is_solved,
..Config::default()
}
}
pub fn detect_nc_profiles(dataset: &CimDataset) -> Vec<String> {
let mut seen: Vec<String> = Vec::new();
for iri in conforms_to(dataset) {
if let Some(code) = nc_profile_code(iri)
&& !seen.iter().any(|s| s == code) {
seen.push(code.to_string());
}
}
seen.sort();
seen
}
fn conforms_to(dataset: &CimDataset) -> impl Iterator<Item = &str> {
["nc:Dataset", "nc:DifferenceSet"]
.into_iter()
.flat_map(|t| dataset.by_type.get(t).into_iter().flatten())
.filter_map(|mrid| dataset.entries.get(mrid))
.flat_map(|el| {
el.get_refs("conformsTo").iter().map(String::as_str).chain(el.get_str("conformsTo"))
})
}
pub fn nc_profile_code(iri: &str) -> Option<&'static str> {
let iri = iri.trim();
crate::nc_profile_index()
.0
.iter()
.find(|(known, _)| *known == iri)
.map(|(_, code)| *code)
}