use super::auxiliary::AuxFile;
#[derive(Debug, Clone, PartialEq)]
pub struct Contingency {
pub label: String,
pub actions: Vec<String>,
}
#[must_use]
pub fn contingencies(aux: &AuxFile) -> Vec<Contingency> {
let mut out = Vec::new();
for blk in aux.data_of("Contingency") {
let Some(label_at) = blk.field_index("CTGLabel") else {
continue;
};
for row in &blk.rows {
let Some(label) = row.values.get(label_at) else {
continue;
};
let actions = row
.subdata
.iter()
.filter(|s| s.name.eq_ignore_ascii_case("CTGElement"))
.flat_map(|s| s.lines.iter())
.filter_map(|line| first_quoted(line))
.map(str::to_string)
.collect();
out.push(Contingency {
label: label.clone(),
actions,
});
}
}
out
}
#[must_use]
pub fn rating_set_names(aux: &AuxFile, object_type: &str) -> Vec<(usize, String)> {
let mut out = Vec::new();
for blk in aux.data_of(object_type) {
let (Some(num_at), Some(name_at)) = (
blk.field_index("RatingSetNum"),
blk.field_index("RatingSetName"),
) else {
continue;
};
for row in &blk.rows {
if let (Some(num), Some(name)) = (row.values.get(num_at), row.values.get(name_at)) {
if let Ok(n) = num.trim().parse() {
out.push((n, name.clone()));
}
}
}
}
out
}
fn first_quoted(line: &str) -> Option<&str> {
let start = line.find('"')? + 1;
let end = start + line[start..].find('"')?;
Some(line[start..end].trim())
}