use lazy_regex::regex_replace_all;
use serde::{Deserialize, Deserializer};
use crate::DYNASTY_READER_BASE;
pub(crate) fn name_to_permalink(name: &str) -> String {
regex_replace_all!(r"[^\d\w\s_.-]+", name, |_| "")
.replace(|c| c == '_' || c == '.' || c == '-', " ")
.split_whitespace()
.collect::<Vec<_>>()
.join("_")
.to_lowercase()
}
pub(crate) fn join_path_with_dynasty_reader_base<'de, D: Deserializer<'de>>(
deserializer: D,
) -> Result<String, D::Error> {
let path: Option<&str> = Deserialize::deserialize(deserializer)?;
if let Some(path) = path {
Ok(DYNASTY_READER_BASE.join(path).unwrap().to_string())
} else {
Ok(String::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_convert_name_to_permalink() {
let predicates = [
("\"Toda-san,\"", "toda_san"),
("Girl @ Girl", "girl_girl"),
("B.G.M.R.S.P.", "b_g_m_r_s_p"),
("Assorted NicoMaki (03015)", "assorted_nicomaki_03015"),
(
"Love Live! Comic Anthology μ’s Precious Days",
"love_live_comic_anthology_μs_precious_days",
),
(
"a_story_about_doing_xx_to_girls_from_different_species_ch51",
"a_story_about_doing_xx_to_girls_from_different_species_ch51",
),
];
for (left, right) in predicates {
assert_eq!(name_to_permalink(left), right)
}
}
}