use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
#[serde(rename = "enabled-categories", default)]
pub enabled_categories: Vec<String>,
#[serde(rename = "disabled-categories", default)]
pub disabled_categories: Vec<String>,
#[serde(rename = "enabled-rules", default)]
pub enabled_rules: Vec<String>,
#[serde(rename = "disabled-rules", default)]
pub disabled_rules: Vec<String>,
#[serde(rename = "deprecated-warning", default)]
pub deprecated_warning: DeprecatedWarningLevel,
#[serde(rename = "markdownlint-compatible", default)]
pub markdownlint_compatible: bool,
#[serde(rename = "auto-fix", default = "default_auto_fix")]
pub auto_fix: bool,
#[serde(flatten)]
pub rule_configs: HashMap<String, toml::Value>,
}
fn default_auto_fix() -> bool {
true
}
impl Default for Config {
fn default() -> Self {
Self {
enabled_categories: Vec::new(),
disabled_categories: Vec::new(),
enabled_rules: Vec::new(),
disabled_rules: Vec::new(),
deprecated_warning: DeprecatedWarningLevel::default(),
markdownlint_compatible: false,
auto_fix: true, rule_configs: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum DeprecatedWarningLevel {
#[default]
Warn,
Info,
Silent,
}
impl Config {
pub fn should_run_rule(
&self,
rule_id: &str,
rule_category: &str,
rule_enabled_by_default: bool,
) -> bool {
if self.enabled_rules.contains(&rule_id.to_string()) {
return true;
}
if self.disabled_rules.contains(&rule_id.to_string()) {
return false;
}
if self.enabled_categories.contains(&rule_category.to_string()) {
return true;
}
if self
.disabled_categories
.contains(&rule_category.to_string())
{
return false;
}
rule_enabled_by_default
}
pub fn should_auto_fix_rule(&self, rule_id: &str) -> bool {
if let Some(rule_config) = self.rule_configs.get(rule_id)
&& let Some(auto_fix) = rule_config.get("auto-fix").and_then(|v| v.as_bool())
{
return auto_fix;
}
self.auto_fix
}
}