use crate::rule_config_serde::RuleConfig;
use crate::types::IndentSize;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "kebab-case")]
pub enum IndentStyle {
#[default]
#[serde(rename = "text-aligned", alias = "text_aligned")]
TextAligned,
#[serde(rename = "fixed")]
Fixed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub struct MD007Config {
#[serde(default = "default_indent")]
pub indent: IndentSize,
#[serde(default, alias = "start_indented")]
pub start_indented: bool,
#[serde(default = "default_start_indent", alias = "start_indent")]
pub start_indent: IndentSize,
#[serde(default)]
pub style: IndentStyle,
#[serde(skip)]
pub style_explicit: bool,
#[serde(skip)]
pub indent_explicit: bool,
}
fn default_indent() -> IndentSize {
IndentSize::from_const(2)
}
fn default_start_indent() -> IndentSize {
IndentSize::from_const(2)
}
impl Default for MD007Config {
fn default() -> Self {
Self {
indent: default_indent(),
start_indented: false,
start_indent: default_start_indent(),
style: IndentStyle::default(),
style_explicit: false,
indent_explicit: false,
}
}
}
impl RuleConfig for MD007Config {
const RULE_NAME: &'static str = "MD007";
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_snake_case_backwards_compatibility() {
let toml_str = r#"
start_indented = true
start_indent = 4
"#;
let config: MD007Config = toml::from_str(toml_str).unwrap();
assert!(config.start_indented);
assert_eq!(config.start_indent.get(), 4);
}
#[test]
fn test_kebab_case_canonical_format() {
let toml_str = r#"
start-indented = true
start-indent = 4
"#;
let config: MD007Config = toml::from_str(toml_str).unwrap();
assert!(config.start_indented);
assert_eq!(config.start_indent.get(), 4);
}
#[test]
fn test_indent_validation() {
let toml_str = r#"
indent = 0
"#;
let result: Result<MD007Config, _> = toml::from_str(toml_str);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(err.contains("must be between 1 and 8") || err.contains("got 0"));
let toml_str = r#"
indent = 9
"#;
let result: Result<MD007Config, _> = toml::from_str(toml_str);
assert!(result.is_err());
let err = result.unwrap_err().to_string();
assert!(err.contains("must be between 1 and 8") || err.contains("got 9"));
}
}