use super::Ukrainian;
use super::super::Translator;
impl Translator for Ukrainian {
fn to_latin(&self, input: &String) -> String {
let mut output = String::new();
let mut skip_counter: usize = 0;
for (i, c) in input.chars().enumerate() {
if skip_counter > 0 {
skip_counter -= 1; continue;
}
let unchanged_str: String;
output.push_str(match c {
'А' => "A",
'а' => "a",
'Б' => "B",
'б' => "b",
'В' => {
match input.chars().nth(i + 1) {
Some(ch) => {
match ch {
'ь' | 'Ь' => {
skip_counter += 1; "W"
}
_ => "V",
}
}
None => "V",
}
}
'в' =>
{
match input.chars().nth(i + 1) {
Some(ch) => {
match ch {
'ь' | 'Ь' => {
skip_counter += 1; "w"
}
_ => "v",
}
}
None => "v",
}
}
'Г' | 'Ґ' => "G",
'г' | 'ґ' => "g",
'Д' => "D",
'д' => "d",
'Е' => "E",
'е' => "e",
'Є' => "YE",
'є' => "ye",
'Ж' => "J",
'ж' => "j",
'З' => "Z",
'з' => "z",
'И' | 'І' => "I",
'и' | 'і' => "i",
'Ї' => "YI",
'ї' => "yi",
'К' => {
match input.chars().nth(i + 1) {
Some(ch) => {
match ch {
'Є' | 'Е' | 'И' | 'Й' | 'є' | 'е' | 'и' | 'й' => "K",
' ' => {
match i {
0 => "K",
_ => match input.chars().nth(i - 1) {
Some(ch) => match ch {
'К' | 'А' | 'И' | 'О' | 'к' | 'а' | 'и' | 'о' | ' ' => "K",
_ => "C",
},
None => "K",
},
}
}
'Ю' | 'ю' => {
skip_counter += 1;
"Q"
}
'с' | 'С' => {
skip_counter += 1;
"X"
}
'ʼ' => {
skip_counter += 1; "K"
}
'ь' | 'Ь' => {
skip_counter += 1; "C"
}
_ => "C",
}
}
None => {
match i {
0 => "K",
_ => match input.chars().nth(i - 1) {
Some(ch) => match ch {
'К' | 'А' | 'И' | 'О' | 'У' | 'к' | 'а' | 'и' | 'о' | 'у' | ' ' => {
"K"
}
_ => "C",
},
None => "K",
},
}
}
}
}
'к' => {
match input.chars().nth(i + 1) {
Some(ch) => {
match ch {
'Є' | 'Е' | 'И' | 'Й' | 'є' | 'е' | 'и' | 'й' => "k",
' ' => {
match i {
0 => "k",
_ => match input.chars().nth(i - 1) {
Some(ch) => match ch {
'К' | 'А' | 'И' | 'О' | 'к' | 'а' | 'и' | 'о' | ' ' => "k",
_ => "c",
},
None => "k",
},
}
}
'Ю' | 'ю' => {
skip_counter += 1;
"q"
}
'с' | 'С' => {
skip_counter += 1;
"x"
}
'ʼ' => {
skip_counter += 1; "k"
}
'ь' | 'Ь' => {
skip_counter += 1; "c"
}
_ => "c",
}
}
None => {
match i {
0 => "k",
_ => match input.chars().nth(i - 1) {
Some(ch) => match ch {
'К' | 'А' | 'И' | 'О' | 'У' | 'к' | 'а' | 'и' | 'о' | 'у' | ' ' => {
"k"
}
_ => "c",
},
None => "k",
},
}
}
}
}
'Л' => "L",
'л' => "l",
'М' => "M",
'м' => "m",
'Н' => "N",
'н' => "n",
'О' => "O",
'о' => "o",
'П' => "P",
'п' => "p",
'Р' => "R",
'р' => "r",
'С' => "S",
'с' => "s",
'Т' => "T",
'т' => "t",
'У' => "U",
'у' => "u",
'Ф' => "F",
'ф' => "f",
'Х' => "H",
'х' => "h",
'Ч' => "CH",
'ч' => "ch",
'Ш' => "SH",
'ш' => "sh",
'Щ' => "SHH",
'щ' => "shh",
'ʼ' => "'",
'Й' => "Y",
'й' => "y",
'Ь' => "`",
'ь' => "`",
'Ю' => "YU",
'ю' => "yu",
'Я' => "YA",
'я' => "ya",
'Ц' => "Z",
'ц' => "z",
'№' => "#",
_ => {
unchanged_str = c.to_string();
unchanged_str.as_str()
}
});
}
output
}
fn to_cyrillic(&self, input: &String) -> String {
let mut output: String = String::new();
let mut skip_cycles: usize = 0;
for (i, c) in input.chars().enumerate() {
if skip_cycles > 0 {
skip_cycles -= 1;
continue;
}
let unchanged_str: String;
output.push_str(match c {
'A' => "А",
'a' => "а",
'B' => "Б",
'b' => "б",
'C' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'h' | 'H' => {
skip_cycles += 1;
"Ч"
}
_ => "К",
},
None => "К",
},
'c' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'h' | 'H' => {
skip_cycles += 1;
"ч"
}
_ => "к",
},
None => "к",
},
'D' => "Д",
'd' => "д",
'E' => "Е",
'e' => "е",
'F' => "Ф",
'f' => "ф",
'G' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'y' | 'Y' | 'e' | 'E' | 'i' | 'I' => "ДЖ",
_ => "Г",
},
None => "Г",
},
'g' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'y' | 'Y' | 'e' | 'E' | 'i' | 'I' => "дж",
_ => "г",
},
None => "г",
},
'H' => "Х",
'h' => "х",
'I' => match input.chars().nth(i + 1) { Some(ch) => match ch {
'u' | 'U' => {
skip_cycles += 1;
"Ю"
}
'a' | 'A' => {
skip_cycles += 1;
"Я"
}
_ => "И",
},
None => "И",
},
'i' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'u' | 'U' => {
skip_cycles += 1;
"ю"
}
'a' | 'A' => {
skip_cycles += 1;
"я"
}
_ => "и",
},
None => "и",
},
'J' => "Ж",
'j' => "ж",
'K' => "К",
'k' => "к",
'L' => "Л",
'l' => "л",
'M' => "М",
'm' => "м",
'N' => "Н",
'n' => "н",
'O' => "О",
'o' => "о",
'P' => "П",
'p' => "п",
'Q' => "КЮ",
'q' => "кю",
'R' => "Р",
'r' => "р",
'S' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'h' | 'H' => {
skip_cycles += 1;
"Ш"
}
_ => "С",
},
None => "С",
},
's' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'h' | 'H' => {
skip_cycles += 1;
"ш"
}
_ => "с",
},
None => "с",
},
'T' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
's' | 'S' => {
skip_cycles += 1;
"Ц"
}
_ => "Т",
},
None => "Т",
},
't' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
's' | 'T' => {
skip_cycles += 1;
"ц"
}
_ => "т",
},
None => "т",
},
'U' => "У",
'u' => "у",
'V' => "В",
'v' => "в",
'W' => "У",
'w' => "у",
'X' => "КС",
'x' => "кс",
'Y' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'e' | 'E' => {
skip_cycles += 1;
"Є"
}
_ => "Й",
},
None => "Й",
},
'y' => match input.chars().nth(i + 1) {
Some(ch) => match ch {
'e' | 'E' => {
skip_cycles += 1;
"є"
}
_ => "й",
},
None => "й",
},
'Z' => "З",
'z' => "з",
_ => {
unchanged_str = c.to_string();
unchanged_str.as_str()
}
});
}
output
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::translator::{new_translator, Language};
#[test]
fn test_translator_lang_ukrainian_to_latin() {
let translator: Box<dyn Translator> = new_translator(Language::Ukrainian);
let input: String = String::from("лс -л");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ls -l");
let input: String = String::from("екхо хелло");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "echo hello");
let input: String = String::from("ифконфиг етх0 аддресс 192.168.1.30 нетмаскʼ 255.255.255.0"); let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(
output,
"ifconfig eth0 address 192.168.1.30 netmask 255.255.255.0"
);
let input: String = String::from("кат РЕАДМЕ.мд");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "cat README.md");
let input: String = String::from("абкьдефгґхиіїжкʼлмнопкюрстуввьксйзшщюячц");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "abcdefgghiiyijklmnopqrstuvwxyzshshhyuyachz");
let input: String = String::from("АБКЬДЕФГҐХИІЇЖКʼЛМНОПКЮРСТУВВЬКСЙЗШЩЮЯЧЦ");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ABCDEFGGHIIYIJKLMNOPQRSTUVWXYZSHSHHYUYACHZ");
let input: String = String::from("москюуитто_пуб");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "mosquitto_pub");
let input: String = String::from("МОСКЮУИТТО_ПУБ");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "MOSQUITTO_PUB");
let input: String = String::from("срв");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "srv");
let input: String = String::from("СРВ");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "SRV");
let input: String = String::from("єлл");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "yell");
let input: String = String::from("ЄЛЛ");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "YELL");
let input: String = String::from("чекк чекк");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "check check");
let input: String = String::from("ЧЕКК ЧЕКК");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "CHECK CHECK");
let input: String = String::from("рек к к");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "rec k k");
let input: String = String::from("РЕК К К");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "REC K K");
let input: String = String::from("ок ок");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ok ok");
let input: String = String::from("ОК ОК");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "OK OK");
let input: String = String::from("к о");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "k o");
let input: String = String::from("К О");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "K O");
let input: String = String::from("как бар");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "cak bar");
let input: String = String::from("КАК БАР");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "CAK BAR");
let input: String = String::from("как");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "cak");
let input: String = String::from("КАК");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "CAK");
let input: String = String::from("кд");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "cd");
let input: String = String::from("КД");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "CD");
let input: String = String::from("ʼьʼЬ");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "'`'`");
let input: String = String::from("№");
let output = translator.to_latin(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "#");
}
#[test]
fn test_translator_lang_ukrainian_to_cyrillic() {
let translator: Box<dyn Translator> = new_translator(Language::Ukrainian);
let input: String = String::from("a b c d e f g h i j k l m n o p q r s t u v w x y z");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(
output,
"а б к д е ф г х и ж к л м н о п кю р с т у в у кс й з"
);
let input: String = String::from("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(
output,
"А Б К Д Е Ф Г Х И Ж К Л М Н О П КЮ Р С Т У В У КС Й З"
);
let input: String = String::from("shell");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "шелл");
let input: String = String::from("SHELL");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ШЕЛЛ");
let input: String = String::from("Option");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "Оптион");
let input: String = String::from("OPTION");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ОПТИОН");
let input: String = String::from("tsunami");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "цунами");
let input: String = String::from("TSUNAMI");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЦУНАМИ");
let input: String = String::from("gin and games");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "джин анд гамес");
let input: String = String::from("GIN AND GAMES");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ДЖИН АНД ГАМЕС");
let input: String = String::from("iuta");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "юта");
let input: String = String::from("IUTA");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЮТА");
let input: String = String::from("yellow");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "єллоу");
let input: String = String::from("YELLOW");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЄЛЛОУ");
let input: String = String::from("giulia");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "джюля");
let input: String = String::from("GIULIA");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ДЖЮЛЯ");
let input: String = String::from("channel");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "чаннел");
let input: String = String::from("CHANNEL");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЧАННЕЛ");
let input: String = String::from("Usage: cat [OPTION]... [FILE]...");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "Усадже: кат [ОПТИОН]... [ФИЛЕ]...");
let input: String = String::from("chic");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "чик");
let input: String = String::from("CHIC");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЧИК");
let input: String = String::from("gag");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "гаг");
let input: String = String::from("GAG");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ГАГ");
let input: String = String::from("vi");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ви");
let input: String = String::from("VI");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ВИ");
let input: String = String::from("less");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "лесс");
let input: String = String::from("LESS");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЛЕСС");
let input: String = String::from("cat");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "кат");
let input: String = String::from("CAT");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "КАТ");
let input: String = String::from("yacc");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "йакк");
let input: String = String::from("YACC");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "ЙАКК");
let input: String = String::from("y");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "й");
let input: String = String::from("Y");
let output = translator.to_cyrillic(&input);
println!("\"{}\" => \"{}\"", input, output);
assert_eq!(output, "Й");
}
}