use super::LintRule;
use alloc::{boxed::Box, vec, vec::Vec};
pub mod accessibility;
pub mod encoding;
pub mod invalid_color;
pub mod invalid_tag;
pub mod missing_style;
pub mod negative_duration;
pub mod performance;
pub mod timing_overlap;
pub use accessibility::AccessibilityRule;
pub use encoding::EncodingRule;
pub use invalid_color::InvalidColorRule;
pub use invalid_tag::InvalidTagRule;
pub use missing_style::MissingStyleRule;
pub use negative_duration::NegativeDurationRule;
pub use performance::PerformanceRule;
pub use timing_overlap::TimingOverlapRule;
pub struct BuiltinRules;
impl BuiltinRules {
#[must_use]
pub fn all_rules() -> Vec<Box<dyn LintRule>> {
vec![
Box::new(TimingOverlapRule),
Box::new(NegativeDurationRule),
Box::new(InvalidColorRule),
Box::new(MissingStyleRule),
Box::new(InvalidTagRule),
Box::new(PerformanceRule),
Box::new(EncodingRule),
Box::new(AccessibilityRule),
]
}
#[must_use]
pub fn rules_for_category(category: super::IssueCategory) -> Vec<Box<dyn LintRule>> {
Self::all_rules()
.into_iter()
.filter(|rule| rule.category() == category)
.collect()
}
#[must_use]
pub fn rule_by_id(id: &str) -> Option<Box<dyn LintRule>> {
Self::all_rules().into_iter().find(|rule| rule.id() == id)
}
#[must_use]
pub fn all_rule_ids() -> Vec<&'static str> {
Self::all_rules().iter().map(|rule| rule.id()).collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_rules_count_correct() {
let rules = BuiltinRules::all_rules();
assert_eq!(rules.len(), 8);
}
#[test]
fn all_rules_have_unique_ids() {
let rules = BuiltinRules::all_rules();
let mut ids = Vec::new();
for rule in rules {
let id = rule.id();
assert!(!ids.contains(&id), "Duplicate rule ID: {id}");
ids.push(id);
}
}
#[test]
fn rule_by_id_works() {
let rule = BuiltinRules::rule_by_id("timing-overlap");
assert!(rule.is_some());
assert_eq!(rule.unwrap().id(), "timing-overlap");
let missing = BuiltinRules::rule_by_id("nonexistent");
assert!(missing.is_none());
}
#[test]
fn all_rule_ids_complete() {
let ids = BuiltinRules::all_rule_ids();
let expected_ids = [
"timing-overlap",
"negative-duration",
"invalid-color",
"missing-style",
"invalid-tag",
"performance",
"encoding",
"accessibility",
];
for expected_id in expected_ids {
assert!(ids.contains(&expected_id), "Missing rule ID: {expected_id}");
}
}
}