dynasty-api 1.1.0

Dynasty Reader's wrappers
Documentation
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)
        }
    }
}