mod dependency_graph;
mod parent;
mod queue_files;
mod relationships;
mod shared;
mod task_fields;
use anyhow::Result;
pub(crate) use task_fields::validate_task_id;
#[derive(Debug, Clone)]
pub struct ValidationWarning {
pub task_id: String,
pub message: String,
}
impl ValidationWarning {
pub fn log(&self) {
log::warn!("[{}] {}", self.task_id, self.message);
}
}
pub fn log_warnings(warnings: &[ValidationWarning]) {
for warning in warnings {
warning.log();
}
}
#[derive(Debug, Default)]
pub struct DependencyValidationResult {
pub warnings: Vec<ValidationWarning>,
}
pub fn validate_queue(
queue: &crate::contracts::QueueFile,
id_prefix: &str,
id_width: usize,
) -> Result<()> {
queue_files::validate_queue(queue, id_prefix, id_width)
}
pub(crate) fn validate_done_queue(
done: Option<&crate::contracts::QueueFile>,
id_prefix: &str,
id_width: usize,
) -> Result<()> {
queue_files::validate_done_queue(done, id_prefix, id_width)
}
pub fn validate_queue_set(
active: &crate::contracts::QueueFile,
done: Option<&crate::contracts::QueueFile>,
id_prefix: &str,
id_width: usize,
max_dependency_depth: u8,
) -> Result<Vec<ValidationWarning>> {
queue_files::validate_queue(active, id_prefix, id_width)?;
queue_files::validate_done_queue(done, id_prefix, id_width)?;
queue_files::validate_cross_file_duplicates(active, done)?;
let catalog = shared::TaskCatalog::new(active, done);
let mut result = DependencyValidationResult::default();
dependency_graph::validate_dependency_graph(&catalog, max_dependency_depth, &mut result)?;
relationships::validate_relationships(&catalog, &mut result)?;
parent::validate_parent_ids(&catalog, &mut result)?;
Ok(result.warnings)
}
#[cfg(test)]
mod tests;