swc_css_lints/
config.rs

1use std::fmt::Debug;
2
3use serde::{Deserialize, Serialize};
4
5use crate::rules::{
6    at_rule_no_unknown::AtRuleNoUnknownConfig, color_hex_alpha::ColorHexAlphaConfig,
7    color_hex_length::ColorHexLengthConfig,
8    font_family_no_duplicate_names::FontFamilyNoDuplicateNamesConfig,
9    no_invalid_position_at_import_rule::NoInvalidPositionAtImportRuleConfig,
10    selector_max_class::SelectorMaxClassConfig,
11    selector_max_combinators::SelectorMaxCombinatorsConfig, unit_no_unknown::UnitNoUnknownConfig,
12};
13
14#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
15#[serde(rename_all = "lowercase")]
16pub enum LintRuleReaction {
17    Off,
18    Warning,
19    Error,
20}
21
22impl Default for LintRuleReaction {
23    fn default() -> Self {
24        Self::Off
25    }
26}
27
28#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
29#[serde(untagged)]
30enum LintRuleLevel {
31    Str(LintRuleReaction),
32    Number(u8),
33}
34
35impl Default for LintRuleLevel {
36    fn default() -> Self {
37        Self::Str(LintRuleReaction::Off)
38    }
39}
40
41impl From<LintRuleLevel> for LintRuleReaction {
42    fn from(level: LintRuleLevel) -> Self {
43        match level {
44            LintRuleLevel::Str(level) => level,
45            LintRuleLevel::Number(level) => match level {
46                1 => LintRuleReaction::Warning,
47                2 => LintRuleReaction::Error,
48                _ => LintRuleReaction::Off,
49            },
50        }
51    }
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize)]
55pub struct RuleConfig<T: Debug + Clone + Serialize + Default>(
56    #[serde(default)] LintRuleLevel,
57    #[serde(default)] T,
58);
59
60impl<T: Debug + Clone + Serialize + Default> RuleConfig<T> {
61    #[inline]
62    pub(crate) fn get_rule_reaction(&self) -> LintRuleReaction {
63        self.0.into()
64    }
65
66    #[inline]
67    pub(crate) fn get_rule_config(&self) -> &T {
68        &self.1
69    }
70}
71
72#[derive(Debug, Clone, Default, Serialize, Deserialize)]
73#[non_exhaustive]
74#[serde(rename_all = "kebab-case")]
75pub struct RulesConfig {
76    #[serde(default, alias = "blockNoEmpty")]
77    pub block_no_empty: RuleConfig<()>,
78
79    #[serde(default, alias = "atRuleNoUnknown")]
80    pub at_rule_no_unknown: RuleConfig<AtRuleNoUnknownConfig>,
81
82    #[serde(default, alias = "noEmptySource")]
83    pub no_empty_source: RuleConfig<()>,
84
85    #[serde(default, alias = "declarationNoImportant")]
86    pub declaration_no_important: RuleConfig<()>,
87
88    #[serde(default, alias = "keyframeDeclarationNoImportant")]
89    pub keyframe_declaration_no_important: RuleConfig<()>,
90
91    #[serde(default, alias = "noInvalidPositionAtImportRule")]
92    pub no_invalid_position_at_import_rule: RuleConfig<NoInvalidPositionAtImportRuleConfig>,
93
94    #[serde(default, alias = "selectorMaxClass")]
95    pub selector_max_class: RuleConfig<SelectorMaxClassConfig>,
96
97    #[serde(default, alias = "colorHexLength")]
98    pub color_hex_length: RuleConfig<ColorHexLengthConfig>,
99
100    #[serde(default, alias = "colorNoInvalidHex")]
101    pub color_no_invalid_hex: RuleConfig<()>,
102
103    #[serde(default, alias = "unitNoUnknown")]
104    pub unit_no_unknown: RuleConfig<UnitNoUnknownConfig>,
105
106    #[serde(default, alias = "selectorMaxCombinators")]
107    pub selector_max_combinators: RuleConfig<SelectorMaxCombinatorsConfig>,
108
109    #[serde(default, alias = "fontFamilyNoDuplicateNames")]
110    pub font_family_no_duplicate_names: RuleConfig<FontFamilyNoDuplicateNamesConfig>,
111
112    #[serde(default, alias = "colorHexAlpha")]
113    pub color_hex_alpha: RuleConfig<ColorHexAlphaConfig>,
114
115    #[serde(default, alias = "noDuplicateAtImportRules")]
116    pub no_duplicate_at_import_rules: RuleConfig<()>,
117
118    #[serde(default, alias = "customPropertyNoMissingVarFunction")]
119    pub custom_property_no_missing_var_function: RuleConfig<()>,
120}
121
122#[derive(Debug, Clone, Default, Serialize, Deserialize)]
123pub struct LintConfig {
124    #[serde(default)]
125    pub rules: RulesConfig,
126}