to-kana 0.6.0

Converts English phonetics to Kana, And Kana to small/half-width versions
Documentation
use super::{unexpected_char_error, unexpected_end_of_string, Result};

use g::g;
use k::k;
use small::small;

mod b;
mod c;
mod d;
mod f;
mod g;
mod h;
mod j;
mod k;
mod m;
mod n;
mod p;
mod r;
mod s;
mod small;
mod t;
mod v;
mod w;
mod y;
mod z;

/// Converts an English alphabet string to Hiragana
///
/// # Example
///
/// ```
/// use to_kana::hira;
///
/// let si = hira("si").unwrap();
/// let shi = hira("shi").unwrap();
/// let ssi = hira("ssi").unwrap();
/// let sshi = hira("sshi").unwrap();
///
/// assert_eq!("し", si);
/// assert_eq!("し", shi);
/// assert_eq!("っし", ssi);
/// assert_eq!("っし", sshi);
/// ```
pub fn hira(s: &str) -> Result {
    let mut hiragana = String::new();
    let mut characters = s.chars().enumerate().peekable();

    while let Some((i, c)) = characters.next() {
        match c {
            '\'' => {}
            ',' => hiragana.push(''),
            '.' => hiragana.push(''),
            '/' => hiragana.push(''),
            '!' => hiragana.push(''),
            '?' => hiragana.push(''),
            '-' => hiragana.push(''),
            '[' => hiragana.push(''),
            ']' => hiragana.push(''),
            '1' => hiragana.push(''),
            '2' => hiragana.push(''),
            '3' => hiragana.push(''),
            '4' => hiragana.push(''),
            '5' => hiragana.push(''),
            '6' => hiragana.push(''),
            '7' => hiragana.push(''),
            '8' => hiragana.push(''),
            '9' => hiragana.push(''),
            '0' => hiragana.push(''),
            'a' => hiragana.push(''),
            'i' => hiragana.push(''),
            'u' => hiragana.push(''),
            'e' => hiragana.push(''),
            'o' => hiragana.push(''),
            'k' => k(&mut hiragana, &mut characters)?,
            'g' => g(&mut hiragana, &mut characters)?,
            's' => s::s(&mut hiragana, &mut characters)?,
            'z' => z::z(&mut hiragana, &mut characters)?,
            'j' => j::j(&mut hiragana, &mut characters)?,
            't' => t::t(&mut hiragana, &mut characters)?,
            'c' => c::c(&mut hiragana, &mut characters)?,
            'd' => d::d(&mut hiragana, &mut characters)?,
            'n' => n::n(&mut hiragana, &mut characters)?,
            'h' => h::h(&mut hiragana, &mut characters)?,
            'b' => b::b(&mut hiragana, &mut characters)?,
            'p' => p::p(&mut hiragana, &mut characters)?,
            'f' => f::f(&mut hiragana, &mut characters)?,
            'v' => v::v(&mut hiragana, &mut characters)?,
            'm' => m::m(&mut hiragana, &mut characters)?,
            'y' => y::y(&mut hiragana, &mut characters)?,
            'r' => r::r(&mut hiragana, &mut characters)?,
            'w' => w::w(&mut hiragana, &mut characters)?,
            'x' => small(&mut hiragana, &mut characters)?,
            _ => return Err(unexpected_char_error(i, c)),
        }
    }
    Ok(hiragana)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn to_hiragana() {
        assert_eq!(hira("a"), Ok(String::from("")));
        assert_eq!(hira("i"), Ok(String::from("")));
        assert_eq!(hira("u"), Ok(String::from("")));
        assert_eq!(hira("e"), Ok(String::from("")));
        assert_eq!(hira("o"), Ok(String::from("")));
        assert_eq!(hira("xa"), Ok(String::from("")));
        assert_eq!(hira("xi"), Ok(String::from("")));
        assert_eq!(hira("xu"), Ok(String::from("")));
        assert_eq!(hira("xe"), Ok(String::from("")));
        assert_eq!(hira("xo"), Ok(String::from("")));
        assert_eq!(hira("ka"), Ok(String::from("")));
        assert_eq!(hira("ki"), Ok(String::from("")));
        assert_eq!(hira("ku"), Ok(String::from("")));
        assert_eq!(hira("ke"), Ok(String::from("")));
        assert_eq!(hira("ko"), Ok(String::from("")));
        assert_eq!(hira("kya"), Ok(String::from("きゃ")));
        assert_eq!(hira("kyu"), Ok(String::from("きゅ")));
        assert_eq!(hira("kyo"), Ok(String::from("きょ")));
        assert_eq!(hira("ga"), Ok(String::from("")));
        assert_eq!(hira("gi"), Ok(String::from("")));
        assert_eq!(hira("gu"), Ok(String::from("")));
        assert_eq!(hira("ge"), Ok(String::from("")));
        assert_eq!(hira("go"), Ok(String::from("")));
        assert_eq!(hira("gya"), Ok(String::from("ぎゃ")));
        assert_eq!(hira("gyu"), Ok(String::from("ぎゅ")));
        assert_eq!(hira("gyo"), Ok(String::from("ぎょ")));
        assert_eq!(hira("sa"), Ok(String::from("")));
        assert_eq!(hira("si"), Ok(String::from("")));
        assert_eq!(hira("su"), Ok(String::from("")));
        assert_eq!(hira("se"), Ok(String::from("")));
        assert_eq!(hira("so"), Ok(String::from("")));
        assert_eq!(hira("sha"), Ok(String::from("しゃ")));
        assert_eq!(hira("shu"), Ok(String::from("しゅ")));
        assert_eq!(hira("she"), Ok(String::from("しぇ")));
        assert_eq!(hira("sho"), Ok(String::from("しょ")));
        assert_eq!(hira("za"), Ok(String::from("")));
        assert_eq!(hira("zi"), Ok(String::from("")));
        assert_eq!(hira("zu"), Ok(String::from("")));
        assert_eq!(hira("ze"), Ok(String::from("")));
        assert_eq!(hira("zo"), Ok(String::from("")));
        assert_eq!(hira("ja"), Ok(String::from("じゃ")));
        assert_eq!(hira("ju"), Ok(String::from("じゅ")));
        assert_eq!(hira("je"), Ok(String::from("じぇ")));
        assert_eq!(hira("jo"), Ok(String::from("じょ")));
        assert_eq!(hira("ta"), Ok(String::from("")));
        assert_eq!(hira("ti"), Ok(String::from("")));
        assert_eq!(hira("tu"), Ok(String::from("")));
        assert_eq!(hira("xtu"), Ok(String::from("")));
        assert_eq!(hira("te"), Ok(String::from("")));
        assert_eq!(hira("to"), Ok(String::from("")));
        assert_eq!(hira("cha"), Ok(String::from("ちゃ")));
        assert_eq!(hira("chu"), Ok(String::from("ちゅ")));
        assert_eq!(hira("che"), Ok(String::from("ちぇ")));
        assert_eq!(hira("cho"), Ok(String::from("ちょ")));
        assert_eq!(hira("thi"), Ok(String::from("てぃ")));
        assert_eq!(hira("thu"), Ok(String::from("てゅ")));
        assert_eq!(hira("da"), Ok(String::from("")));
        assert_eq!(hira("di"), Ok(String::from("")));
        assert_eq!(hira("du"), Ok(String::from("")));
        assert_eq!(hira("de"), Ok(String::from("")));
        assert_eq!(hira("do"), Ok(String::from("")));
        assert_eq!(hira("dhi"), Ok(String::from("でぃ")));
        assert_eq!(hira("dhu"), Ok(String::from("でゅ")));
        assert_eq!(hira("na"), Ok(String::from("")));
        assert_eq!(hira("ni"), Ok(String::from("")));
        assert_eq!(hira("nu"), Ok(String::from("")));
        assert_eq!(hira("ne"), Ok(String::from("")));
        assert_eq!(hira("no"), Ok(String::from("")));
        assert_eq!(hira("nya"), Ok(String::from("にゃ")));
        assert_eq!(hira("nyu"), Ok(String::from("にゅ")));
        assert_eq!(hira("nyo"), Ok(String::from("にょ")));
        assert_eq!(hira("ha"), Ok(String::from("")));
        assert_eq!(hira("hi"), Ok(String::from("")));
        assert_eq!(hira("hu"), Ok(String::from("")));
        assert_eq!(hira("he"), Ok(String::from("")));
        assert_eq!(hira("ho"), Ok(String::from("")));
        assert_eq!(hira("hya"), Ok(String::from("ひゃ")));
        assert_eq!(hira("hyu"), Ok(String::from("ひゅ")));
        assert_eq!(hira("hyo"), Ok(String::from("ひょ")));
        assert_eq!(hira("ba"), Ok(String::from("")));
        assert_eq!(hira("bi"), Ok(String::from("")));
        assert_eq!(hira("bu"), Ok(String::from("")));
        assert_eq!(hira("be"), Ok(String::from("")));
        assert_eq!(hira("bo"), Ok(String::from("")));
        assert_eq!(hira("bya"), Ok(String::from("びゃ")));
        assert_eq!(hira("byu"), Ok(String::from("びゅ")));
        assert_eq!(hira("byo"), Ok(String::from("びょ")));
        assert_eq!(hira("pa"), Ok(String::from("")));
        assert_eq!(hira("pi"), Ok(String::from("")));
        assert_eq!(hira("pu"), Ok(String::from("")));
        assert_eq!(hira("pe"), Ok(String::from("")));
        assert_eq!(hira("po"), Ok(String::from("")));
        assert_eq!(hira("pya"), Ok(String::from("ぴゃ")));
        assert_eq!(hira("pyu"), Ok(String::from("ぴゅ")));
        assert_eq!(hira("pyo"), Ok(String::from("ぴょ")));
        assert_eq!(hira("fa"), Ok(String::from("ふぁ")));
        assert_eq!(hira("fi"), Ok(String::from("ふぃ")));
        assert_eq!(hira("fe"), Ok(String::from("ふぇ")));
        assert_eq!(hira("fo"), Ok(String::from("ふぉ")));
        assert_eq!(hira("va"), Ok(String::from("ゔぁ")));
        assert_eq!(hira("vi"), Ok(String::from("ゔぃ")));
        assert_eq!(hira("vu"), Ok(String::from("")));
        assert_eq!(hira("ve"), Ok(String::from("ゔぇ")));
        assert_eq!(hira("vo"), Ok(String::from("ゔぉ")));
        assert_eq!(hira("ma"), Ok(String::from("")));
        assert_eq!(hira("mi"), Ok(String::from("")));
        assert_eq!(hira("mu"), Ok(String::from("")));
        assert_eq!(hira("me"), Ok(String::from("")));
        assert_eq!(hira("mo"), Ok(String::from("")));
        assert_eq!(hira("mya"), Ok(String::from("みゃ")));
        assert_eq!(hira("myu"), Ok(String::from("みゅ")));
        assert_eq!(hira("myo"), Ok(String::from("みょ")));
        assert_eq!(hira("ya"), Ok(String::from("")));
        assert_eq!(hira("yu"), Ok(String::from("")));
        assert_eq!(hira("yo"), Ok(String::from("")));
        assert_eq!(hira("xya"), Ok(String::from("")));
        assert_eq!(hira("xyu"), Ok(String::from("")));
        assert_eq!(hira("xyo"), Ok(String::from("")));
        assert_eq!(hira("ra"), Ok(String::from("")));
        assert_eq!(hira("ri"), Ok(String::from("")));
        assert_eq!(hira("ru"), Ok(String::from("")));
        assert_eq!(hira("re"), Ok(String::from("")));
        assert_eq!(hira("ro"), Ok(String::from("")));
        assert_eq!(hira("rya"), Ok(String::from("りゃ")));
        assert_eq!(hira("ryu"), Ok(String::from("りゅ")));
        assert_eq!(hira("ryo"), Ok(String::from("りょ")));
        assert_eq!(hira("wa"), Ok(String::from("")));
        assert_eq!(hira("wo"), Ok(String::from("")));
        assert_eq!(hira("n"), Ok(String::from("")));
    }

    #[test]
    fn hiragana_little_tsu() {
        assert_eq!(hira("tte"), Ok(String::from("って")));
        assert_eq!(hira("sshi"), Ok(String::from("っし")));
    }

    #[test]
    fn nakaguro() {
        assert_eq!(
            hira("okuto/katto"),
            Ok(String::from("おくと・かっと"))
        );
    }

    #[test]
    fn many_vowels() {
        assert_eq!(hira("saaaa"), Ok(String::from("さあああ")));
    }
}