Skip to main content

code_baseline/rules/
factory.rs

1#[cfg(feature = "ast")]
2use crate::rules::ast;
3use crate::config::RuleConfig;
4use crate::rules::banned_dependency::BannedDependencyRule;
5use crate::rules::banned_import::BannedImportRule;
6use crate::rules::banned_pattern::BannedPatternRule;
7use crate::rules::file_presence::FilePresenceRule;
8use crate::rules::ratchet::RatchetRule;
9use crate::rules::required_pattern::RequiredPatternRule;
10use crate::rules::tailwind_dark_mode::TailwindDarkModeRule;
11use crate::rules::tailwind_theme_tokens::TailwindThemeTokensRule;
12use crate::rules::window_pattern::WindowPatternRule;
13use crate::rules::{Rule, RuleBuildError};
14use std::fmt;
15
16#[derive(Debug)]
17pub enum FactoryError {
18    UnknownRuleType(String),
19    BuildError(RuleBuildError),
20}
21
22impl fmt::Display for FactoryError {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match self {
25            FactoryError::UnknownRuleType(t) => write!(f, "unknown rule type: '{}'", t),
26            FactoryError::BuildError(e) => write!(f, "{}", e),
27        }
28    }
29}
30
31impl std::error::Error for FactoryError {}
32
33impl From<RuleBuildError> for FactoryError {
34    fn from(e: RuleBuildError) -> Self {
35        FactoryError::BuildError(e)
36    }
37}
38
39/// Build a rule instance from a type string and config.
40pub fn build_rule(rule_type: &str, config: &RuleConfig) -> Result<Box<dyn Rule>, FactoryError> {
41    match rule_type {
42        "tailwind-dark-mode" => Ok(Box::new(TailwindDarkModeRule::new(config)?)),
43        "tailwind-theme-tokens" => Ok(Box::new(TailwindThemeTokensRule::new(config)?)),
44        "ratchet" => Ok(Box::new(RatchetRule::new(config)?)),
45        "banned-pattern" => Ok(Box::new(BannedPatternRule::new(config)?)),
46        "banned-import" => Ok(Box::new(BannedImportRule::new(config)?)),
47        "banned-dependency" => Ok(Box::new(BannedDependencyRule::new(config)?)),
48        "required-pattern" => Ok(Box::new(RequiredPatternRule::new(config)?)),
49        "file-presence" => Ok(Box::new(FilePresenceRule::new(config)?)),
50        "window-pattern" => Ok(Box::new(WindowPatternRule::new(config)?)),
51        #[cfg(feature = "ast")]
52        "max-component-size" => Ok(Box::new(ast::MaxComponentSizeRule::new(config)?)),
53        #[cfg(feature = "ast")]
54        "no-nested-components" => Ok(Box::new(ast::NoNestedComponentsRule::new(config)?)),
55        #[cfg(feature = "ast")]
56        "prefer-use-reducer" => Ok(Box::new(ast::PreferUseReducerRule::new(config)?)),
57        #[cfg(feature = "ast")]
58        "no-cascading-set-state" => Ok(Box::new(ast::NoCascadingSetStateRule::new(config)?)),
59        #[cfg(feature = "ast")]
60        "require-img-alt" => Ok(Box::new(ast::RequireImgAltRule::new(config)?)),
61        _ => Err(FactoryError::UnknownRuleType(rule_type.to_string())),
62    }
63}