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}