use serde::Deserialize;
#[derive(Debug, Clone, Default, Deserialize)]
pub struct RewriteConfig {
pub skip: Option<SkipConfig>,
#[serde(default)]
pub rewrite: Vec<RewriteRule>,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct SkipConfig {
#[serde(default)]
pub patterns: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct RewriteRule {
#[serde(rename = "match")]
pub match_pattern: String,
pub replace: String,
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn deserialize_full_config() {
let toml_str = r#"
[skip]
patterns = ["^my-tool ", "^internal-"]
[[rewrite]]
match = "^docker compose"
replace = "tokf run {0}"
[[rewrite]]
match = "^kubectl (get|describe)"
replace = "tokf run {0}"
"#;
let config: RewriteConfig = toml::from_str(toml_str).unwrap();
let skip = config.skip.unwrap();
assert_eq!(skip.patterns.len(), 2);
assert_eq!(skip.patterns[0], "^my-tool ");
assert_eq!(skip.patterns[1], "^internal-");
assert_eq!(config.rewrite.len(), 2);
assert_eq!(config.rewrite[0].match_pattern, "^docker compose");
assert_eq!(config.rewrite[0].replace, "tokf run {0}");
assert_eq!(config.rewrite[1].match_pattern, "^kubectl (get|describe)");
}
#[test]
fn deserialize_skip_only() {
let toml_str = r#"
[skip]
patterns = ["^nope"]
"#;
let config: RewriteConfig = toml::from_str(toml_str).unwrap();
assert!(config.skip.is_some());
assert!(config.rewrite.is_empty());
}
#[test]
fn deserialize_rules_only() {
let toml_str = r#"
[[rewrite]]
match = "^make"
replace = "tokf run {0}"
"#;
let config: RewriteConfig = toml::from_str(toml_str).unwrap();
assert!(config.skip.is_none());
assert_eq!(config.rewrite.len(), 1);
}
#[test]
fn deserialize_empty_config() {
let config: RewriteConfig = toml::from_str("").unwrap();
assert!(config.skip.is_none());
assert!(config.rewrite.is_empty());
}
#[test]
fn deserialize_empty_skip_patterns() {
let toml_str = r#"
[skip]
patterns = []
"#;
let config: RewriteConfig = toml::from_str(toml_str).unwrap();
let skip = config.skip.unwrap();
assert!(skip.patterns.is_empty());
}
}