use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Default, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct TyposConfig {
#[serde(default)]
pub extend_words: BTreeMap<String, String>,
#[serde(default)]
pub extend_identifiers: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct PolyConfig {
#[serde(default)]
pub exclude: Vec<String>,
#[serde(default)]
pub typos: TyposConfig,
#[serde(default)]
pub per_file_ignores: BTreeMap<String, Vec<String>>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn poly_config_deserializes_empty() {
let cfg: PolyConfig = toml::from_str("").unwrap();
assert!(cfg.exclude.is_empty());
assert!(cfg.typos.extend_words.is_empty());
assert!(cfg.typos.extend_identifiers.is_empty());
assert!(cfg.per_file_ignores.is_empty());
}
#[test]
fn poly_config_deserializes_full() {
let toml_str = r#"
exclude = ["vendor/**", "third-party/**"]
[typos.extend-words]
flate = "flate"
arange = "arange"
[typos.extend-identifiers]
PyMuPDF = "PyMuPDF"
[per-file-ignores]
"**/legacy.py" = ["ANN", "D103"]
"**/compat.py" = ["UP035"]
"#;
let cfg: PolyConfig = toml::from_str(toml_str).unwrap();
assert_eq!(cfg.exclude, vec!["vendor/**", "third-party/**"]);
assert_eq!(cfg.typos.extend_words.len(), 2);
assert_eq!(cfg.typos.extend_words["flate"], "flate");
assert_eq!(cfg.typos.extend_words["arange"], "arange");
assert_eq!(cfg.typos.extend_identifiers.len(), 1);
assert_eq!(cfg.typos.extend_identifiers["PyMuPDF"], "PyMuPDF");
assert_eq!(cfg.per_file_ignores.len(), 2);
assert_eq!(cfg.per_file_ignores["**/legacy.py"], vec!["ANN", "D103"]);
assert_eq!(cfg.per_file_ignores["**/compat.py"], vec!["UP035"]);
}
#[test]
fn poly_config_rejects_unknown_fields() {
let err = toml::from_str::<PolyConfig>("unknown_field = true");
assert!(err.is_err(), "deny_unknown_fields must reject unrecognised keys");
}
#[test]
fn typos_config_deserializes_empty() {
let cfg: TyposConfig = toml::from_str("").unwrap();
assert!(cfg.extend_words.is_empty());
assert!(cfg.extend_identifiers.is_empty());
}
#[test]
fn typos_config_rejects_unknown_fields() {
let err = toml::from_str::<TyposConfig>("unknown_field = true");
assert!(err.is_err(), "deny_unknown_fields must reject unrecognised keys");
}
}