use std::collections::HashSet;
use crate::registry::loader::package_loader::PackageMetadata;
use super::types::ValidationResult;
use super::PackageValidator;
impl PackageValidator {
pub(super) fn validate_metadata(
&self,
metadata: &PackageMetadata,
result: &mut ValidationResult,
) {
if metadata.package_name.is_empty() {
result
.errors
.push("Package name cannot be empty".to_string());
} else if !metadata
.package_name
.chars()
.all(|c| c.is_alphanumeric() || c == '_' || c == '-')
{
result
.warnings
.push("Package name contains non-standard characters".to_string());
}
if metadata.version.is_empty() {
result.warnings.push("Package version is empty".to_string());
}
if metadata.tasks.is_empty() {
result
.warnings
.push("Package contains no tasks".to_string());
} else {
let mut task_ids = HashSet::new();
for task in &metadata.tasks {
if !task_ids.insert(&task.local_id) {
result
.errors
.push(format!("Duplicate task ID: {}", task.local_id));
}
if task.local_id.is_empty() {
result.errors.push("Task has empty ID".to_string());
} else if !task
.local_id
.chars()
.all(|c| c.is_alphanumeric() || c == '_')
{
result.warnings.push(format!(
"Task ID '{}' contains non-standard characters",
task.local_id
));
}
}
}
let current_arch = std::env::consts::ARCH;
if !metadata.architecture.is_empty() && metadata.architecture != current_arch {
result.warnings.push(format!(
"Package architecture '{}' may not be compatible with current architecture '{}'",
metadata.architecture, current_arch
));
}
}
}