use crate::config_schema::{MarkdownRule, markdown_rule_name};
use monochromatic_jsonc_edit::{JsoncEntry, JsoncKey, JsoncValue, emit_jsonc_value};
pub const MARKDOWN_FILE_PATTERNS: [&str; 2] = ["**/*.md", "**/*.mdx"];
fn text(value: &str) -> JsoncValue {
return JsoncValue::text_from_units(value.encode_utf16().collect());
}
fn member(key: &str, value: JsoncValue) -> JsoncEntry {
return JsoncEntry {
key: JsoncKey::from_text(key),
value,
};
}
fn rule_settings(rule: MarkdownRule, exclude: &[String]) -> JsoncValue {
match rule {
MarkdownRule::LfsImageUrl => {
let mut patterns: Vec<JsoncValue> = Vec::new();
for pattern in exclude {
patterns.push(text(pattern.as_str()));
}
return JsoncValue::record(vec![
member("severity", text("warn")),
member("exclude", JsoncValue::array(patterns)),
]);
}
}
}
pub fn one_rule_configuration(rules: &[MarkdownRule], exclude: &[String]) -> String {
let mut files: Vec<JsoncValue> = Vec::new();
for pattern in MARKDOWN_FILE_PATTERNS {
files.push(text(pattern));
}
let mut settings: Vec<JsoncEntry> = Vec::new();
for rule in rules {
settings.push(member(
format!("markdown/{}", markdown_rule_name(*rule)).as_str(),
rule_settings(*rule, exclude),
));
}
let block: JsoncValue = JsoncValue::record(vec![
member("files", JsoncValue::array(files)),
member("rules", JsoncValue::record(settings)),
]);
return emit_jsonc_value(&JsoncValue::array(vec![block]));
}
#[cfg(test)]
#[path = "markdown_linter_config_tests.rs"]
mod tests;