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