use super::types::MutationSourceRevision;
use std::collections::{BTreeMap, BTreeSet};
pub(super) fn collected<Refusal>(
supplied: Vec<MutationSourceRevision>,
duplicate: fn(String) -> Refusal,
) -> Result<BTreeMap<String, MutationSourceRevision>, Refusal> {
let mut roster = BTreeMap::new();
for source in supplied {
let file = source.file().to_owned();
if roster.insert(file.clone(), source).is_some() {
return Err(duplicate(file));
}
}
Ok(roster)
}
pub(super) fn matched<Refusal>(
roster: &BTreeMap<String, MutationSourceRevision>,
expected: &BTreeSet<&str>,
missing: fn(String) -> Refusal,
unexpected: fn(String) -> Refusal,
) -> Result<(), Refusal> {
for file in expected.iter().copied() {
if !roster.contains_key(file) {
return Err(missing(file.to_owned()));
}
}
for file in roster.keys() {
if !expected.contains(file.as_str()) {
return Err(unexpected(file.to_owned()));
}
}
Ok(())
}