use crate::contracts::Task;
use std::collections::HashMap;
pub(super) fn rewrite_task_id_references(
task: &mut Task,
remapped_ids: &HashMap<String, String>,
) -> bool {
let mut modified = false;
modified |= rewrite_id_list(&mut task.depends_on, remapped_ids);
modified |= rewrite_id_list(&mut task.blocks, remapped_ids);
modified |= rewrite_id_list(&mut task.relates_to, remapped_ids);
modified |= rewrite_optional_id(&mut task.duplicates, remapped_ids);
modified |= rewrite_optional_id(&mut task.parent_id, remapped_ids);
modified
}
fn rewrite_id_list(ids: &mut [String], remapped_ids: &HashMap<String, String>) -> bool {
let mut modified = false;
for id in ids {
if let Some(new_id) = remapped_task_id(id, remapped_ids) {
*id = new_id;
modified = true;
}
}
modified
}
fn rewrite_optional_id(id: &mut Option<String>, remapped_ids: &HashMap<String, String>) -> bool {
let Some(current_id) = id.as_deref() else {
return false;
};
let Some(new_id) = remapped_task_id(current_id, remapped_ids) else {
return false;
};
*id = Some(new_id);
true
}
fn remapped_task_id(id: &str, remapped_ids: &HashMap<String, String>) -> Option<String> {
remapped_ids
.get(id)
.or_else(|| remapped_ids.get(id.trim()))
.cloned()
}