use std::path::Path;
use crate::classify::errors::{ClassifyError, Result};
use crate::classify::rules::types::{Rule, RuleSet};
pub fn load_rules(path: &Path) -> Result<RuleSet> {
let text = std::fs::read_to_string(path)?;
let is_json = path
.extension()
.and_then(|e| e.to_str())
.map(|e| e.eq_ignore_ascii_case("json"))
.unwrap_or(false);
let set: RuleSet = if is_json {
serde_json::from_str(&text)?
} else {
serde_yaml::from_str(&text)?
};
if set.rules.is_empty() {
return Err(ClassifyError::RuleLoad(format!(
"rule file {} contained no rules",
path.display()
)));
}
for rule in &set.rules {
if rule.keywords.is_empty() && rule.patterns.is_empty() {
tracing::warn!(
rule_id = %rule.id,
category = %rule.category,
"rule has no keywords or patterns and will never match — \
check YAML field names (use `pattern:` for a single regex or \
`patterns:` for a list; both are accepted)"
);
}
}
Ok(set)
}
pub fn default_rules() -> RuleSet {
use super::default_rules_a::*;
use super::default_rules_b::*;
use super::default_rules_c::*;
use super::default_rules_d::*;
let mut rules: Vec<Rule> = Vec::new();
rules.extend(conventional_commit_rules());
rules.extend(breaking_change_rules());
rules.extend(merge_plumbing_rules());
rules.extend(initial_and_release_rules());
rules.extend(dependency_rules());
rules.extend(code_review_and_cleanup_rules());
rules.extend(infra_rules());
rules.extend(generic_keyword_rules());
rules.extend(cloud_platform_rules());
rules.extend(observability_rules());
rules.extend(datastore_rules());
rules.extend(messaging_rules());
rules.extend(networking_rules());
rules.extend(language_tooling_rules());
rules.extend(pr_hygiene_rules());
rules.extend(experiment_and_rollback_rules());
rules.extend(auto_generated_plumbing_rules());
rules.extend(translation_rules());
rules.extend(documentation_meta_rules());
rules.extend(content_and_assets_rules());
rules.extend(generic_prose_rules());
rules.extend(ticket_reference_rules());
rules.push(catch_all_rule());
RuleSet {
version: Some("1.0".into()),
extend_defaults: true,
rules,
}
}