use std::collections::BTreeSet;
pub(super) fn collect_missing_columns(
expected_columns: &[String],
observed_set: &BTreeSet<String>,
) -> Vec<String> {
expected_columns
.iter()
.filter(|column| !observed_set.contains((*column).as_str()))
.cloned()
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn collect_missing_columns_preserves_expected_order() {
let expected = vec![
"request_id".to_string(),
"route_path".to_string(),
"status_code".to_string(),
];
let observed_set: BTreeSet<String> = ["request_id".to_string(), "status_code".to_string()]
.into_iter()
.collect();
let missing = collect_missing_columns(&expected, &observed_set);
assert_eq!(missing, vec!["route_path".to_string()]);
}
#[test]
fn collect_missing_columns_treats_duplicate_expected_values_as_present() {
let expected = vec![
"request_id".to_string(),
"request_id".to_string(),
"status_code".to_string(),
];
let observed_set: BTreeSet<String> = ["request_id".to_string(), "status_code".to_string()]
.into_iter()
.collect();
let missing = collect_missing_columns(&expected, &observed_set);
assert!(missing.is_empty());
}
}