use crate::contracts::QueueFile;
use anyhow::{Result, bail};
use super::{
BatchOperationResult, BatchResultCollector, preprocess_batch_ids, validate_task_ids_exist,
};
pub fn batch_plan_append(
queue: &mut QueueFile,
task_ids: &[String],
plan_items: &[String],
now_rfc3339: &str,
continue_on_error: bool,
) -> Result<BatchOperationResult> {
let unique_ids = preprocess_batch_ids(task_ids, "plan append")?;
if plan_items.is_empty() {
bail!("No plan items provided for batch plan append");
}
if !continue_on_error {
validate_task_ids_exist(queue, &unique_ids)?;
}
let mut collector =
BatchResultCollector::new(unique_ids.len(), continue_on_error, "plan append");
for task_id in &unique_ids {
match queue.tasks.iter_mut().find(|t| t.id == *task_id) {
Some(task) => {
task.plan.extend(plan_items.iter().cloned());
task.updated_at = Some(now_rfc3339.to_string());
collector.record_success(task_id.clone(), Vec::new());
}
None => {
collector.record_failure(
task_id.clone(),
crate::error_messages::task_not_found_batch_failure(task_id),
)?;
}
}
}
Ok(collector.finish())
}
pub fn batch_plan_prepend(
queue: &mut QueueFile,
task_ids: &[String],
plan_items: &[String],
now_rfc3339: &str,
continue_on_error: bool,
) -> Result<BatchOperationResult> {
let unique_ids = preprocess_batch_ids(task_ids, "plan prepend")?;
if plan_items.is_empty() {
bail!("No plan items provided for batch plan prepend");
}
if !continue_on_error {
validate_task_ids_exist(queue, &unique_ids)?;
}
let mut collector =
BatchResultCollector::new(unique_ids.len(), continue_on_error, "plan prepend");
for task_id in &unique_ids {
match queue.tasks.iter_mut().find(|t| t.id == *task_id) {
Some(task) => {
let mut new_plan = plan_items.to_vec();
new_plan.append(&mut task.plan);
task.plan = new_plan;
task.updated_at = Some(now_rfc3339.to_string());
collector.record_success(task_id.clone(), Vec::new());
}
None => {
collector.record_failure(
task_id.clone(),
crate::error_messages::task_not_found_batch_failure(task_id),
)?;
}
}
}
Ok(collector.finish())
}