const DEUN: (&str, &str, &str) = ("(이)든", "든", "이든");
const DEUNKA: (&str, &str, &str) = ("(이)든가", "든가", "이든가");
const DEUNJI: (&str, &str, &str) = ("(이)든지", "든지", "이든지");
const EUL: (&str, &str, &str) = ("(을)를", "를", "을");
const IDA: (&str, &str, &str) = ("(이)다", "다", "이다");
const INDEUL: (&str, &str, &str) = ("ㄴ", "들", "인들");
const KA: (&str, &str, &str) = ("(이)가", "가", "이");
const KO: (&str, &str, &str) = ("(이)고", "고", "이고");
const MYEO: (&str, &str, &str) = ("(이)며", "며", "이며");
const NA: (&str, &str, &str) = ("(이)나", "나", "이나");
const NAMA: (&str, &str, &str) = ("(이)나마", "나마", "이나마");
const NEUN: (&str, &str, &str) = ("(은)는", "는", "은");
const NI: (&str, &str, &str) = ("(이)니", "니", "이니");
const RADO: (&str, &str, &str) = ("(이)라도", "라도", "이라도");
const RAN: (&str, &str, &str) = ("(이)란", "란", "이란");
const RANG: (&str, &str, &str) = ("(이)랑", "랑", "이랑");
const RAYA: (&str, &str, &str) = ("(이)라야", "라야", "이라야");
const YAMALRO: (&str, &str, &str) = ("(이)야말로", "야말로", "이야말로");
const YEO: (&str, &str, &str) = ("(이)여", "여", "이여");
const WA: (&str, &str, &str) = ("(와)과", "와", "과");
const RO: (&str, &str, &str) = ("(으)로", "로", "으로");
const ROBUTEO: (&str, &str, &str) = ("(으)로부터", "로부터", "으로부터");
const ROSEO: (&str, &str, &str) = ("(으)로서", "로서", "으로서");
const ROSSEO: (&str, &str, &str) = ("(으)로써", "로써", "으로써");
use crate::guess_final_letter;
use crate::modify_finall_jamo;
use crate::identifier::{Tossi, TossiKind, TransTossiWhen};
pub fn tossi(word: &str, tossi: Tossi) -> String {
let tossi_variants = match tossi.kind {
TossiKind::Deun => DEUN,
TossiKind::Deunka => DEUNKA,
TossiKind::Deunji => DEUNJI,
TossiKind::Eul => EUL,
TossiKind::Ida => IDA,
TossiKind::Indeul => INDEUL,
TossiKind::Ka => KA,
TossiKind::Ko => KO,
TossiKind::Myeo => MYEO,
TossiKind::Na => NA,
TossiKind::Nama => NAMA,
TossiKind::Neun => NEUN,
TossiKind::Ni => NI,
TossiKind::Rado => RADO,
TossiKind::Ran => RAN,
TossiKind::Rang => RANG,
TossiKind::Raya => RAYA,
TossiKind::Yamalro => YAMALRO,
TossiKind::Yeo => YEO,
TossiKind::Wa => WA,
TossiKind::Ro => RO,
TossiKind::Roseo => ROSEO,
TossiKind::Rosseo => ROSSEO,
TossiKind::Robuteo => ROBUTEO,
TossiKind::Others => (" ", " ", " "),
};
match tossi.when {
TransTossiWhen::Blank => when_blank(word, tossi_variants).to_string(),
TransTossiWhen::RiEulAndBlank => when_rieul_and_blank(word, tossi_variants).to_string(),
TransTossiWhen::OnlyKa => only_ka(word, tossi_variants),
TransTossiWhen::LastJamoNieun => when_last_jamo_nieun(word, tossi_variants),
TransTossiWhen::Nothing => " ".to_string(),
}
}
fn when_rieul_and_blank<'a>(word: &'a str, tossi_variants: (&'a str, &'a str, &'a str)) -> &'a str {
let filtered = guess_final_letter(word);
if filtered == 'N' {
tossi_variants.0
} else if filtered == ' ' || filtered == 'ㄹ' {
tossi_variants.1
} else {
tossi_variants.2
}
}
fn only_ka<'a>(word: &'a str, tossi_variants: (&'a str, &'a str, &'a str)) -> String {
let filtered = guess_final_letter(word);
if filtered == 'N' {
word.to_string() + tossi_variants.0
} else if filtered == ' ' {
if word == "누구" {
"누가".to_string()
} else if word == "나" {
"내가".to_string()
} else if word == "저" {
"제가".to_string()
} else if word == "너" {
"네가".to_string()
} else {
word.to_string() + tossi_variants.1
}
} else {
word.to_string() + tossi_variants.2
}
}
fn when_last_jamo_nieun<'a>(word: &'a str, tossi_variants: (&'a str, &'a str, &'a str)) -> String {
let filtered = guess_final_letter(word);
if filtered == 'N' {
word.to_string() + tossi_variants.2
} else if filtered == ' ' {
let mut temp_word: String = word.to_string();
let last_char = temp_word.pop();
if let Some(temp) = last_char {
let temp_last_char = modify_finall_jamo(temp, 'ㄴ');
temp_word.push(temp_last_char);
return temp_word + tossi_variants.1;
} else {
word.to_string() + tossi_variants.1
}
} else {
word.to_string() + tossi_variants.2
}
}
fn when_blank<'a>(word: &'a str, tossi_variants: (&'a str, &'a str, &'a str)) -> &'a str {
let filtered = guess_final_letter(word);
if filtered == 'N' {
tossi_variants.0
} else if filtered == ' ' {
tossi_variants.1
} else {
tossi_variants.2
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn _when_only_ka() {
let temp = "철수";
let result = "철수가";
assert_eq!(result, only_ka(temp, KA));
let temp = "법원";
let result = "법원이";
assert_eq!(result, only_ka(temp, KA));
let temp = "google";
let result = "google(이)가";
assert_eq!(result, only_ka(temp, KA));
let temp = "넥슨(코리아)";
let result = "넥슨(코리아)이";
assert_eq!(result, only_ka(temp, KA));
let temp = "비타500";
let result = "비타500이";
assert_eq!(result, only_ka(temp, KA));
let temp = "누구";
let result = "누가";
assert_eq!(result, only_ka(temp, KA));
let temp = "나";
let result = "내가";
assert_eq!(result, only_ka(temp, KA));
let temp = "저";
let result = "제가";
assert_eq!(result, only_ka(temp, KA));
let temp = "너";
let result = "네가";
assert_eq!(result, only_ka(temp, KA));
}
#[test]
fn _when_when_last_jamo_nieun() {
let temp = "철수";
let result = "철순들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "아버지";
let result = "아버진들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "나";
let result = "난들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "법원";
let result = "법원인들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "google";
let result = "google인들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "naver";
let result = "naver인들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "넥슨(코리아)";
let result = "넥슨(코리아)인들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
let temp = "비타500";
let result = "비타500인들";
assert_eq!(result, when_last_jamo_nieun(temp, INDEUL));
}
#[test]
fn _when_rieul_and_blank() {
let temp = "네이버";
let result = "로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
let temp = "법원";
let result = "으로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
let temp = "구글";
let result = "로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
let temp = "google";
let result = "(으)로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
let temp = "넥슨(코리아)";
let result = "으로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
let temp = "비타500";
let result = "으로";
assert_eq!(result, when_rieul_and_blank(temp, RO));
}
#[test]
fn _when_blank() {
let temp = "네이버";
let result = "를";
assert_eq!(result, when_blank(temp, EUL));
let temp = "google";
let result = "(을)를";
assert_eq!(result, when_blank(temp, EUL));
let temp = "넥슨(코리아)";
let result = "을";
assert_eq!(result, when_blank(temp, EUL));
let temp = "비타500";
let result = "을";
assert_eq!(result, when_blank(temp, EUL));
}
#[test]
fn _when_blank_na() {
let temp = "도서관";
let result = "이나";
assert_eq!(result, when_blank(temp, NA));
let temp = "학교";
let result = "나";
assert_eq!(result, when_blank(temp, NA));
let temp = "어제";
let result = "나";
assert_eq!(result, when_blank(temp, NA));
let temp = "google";
let result = "(이)나";
assert_eq!(result, when_blank(temp, NA));
let temp = "넥슨(코리아)";
let result = "이나";
assert_eq!(result, when_blank(temp, NA));
let temp = "비타500";
let result = "이나";
assert_eq!(result, when_blank(temp, NA));
}
#[test]
fn _when_blank_rang() {
let temp = "도서관";
let result = "이랑";
assert_eq!(result, when_blank(temp, RANG));
let temp = "학교";
let result = "랑";
assert_eq!(result, when_blank(temp, RANG));
let temp = "어제";
let result = "랑";
assert_eq!(result, when_blank(temp, RANG));
let temp = "google";
let result = "(이)랑";
assert_eq!(result, when_blank(temp, RANG));
let temp = "넥슨(코리아)";
let result = "이랑";
assert_eq!(result, when_blank(temp, RANG));
let temp = "비타500";
let result = "이랑";
assert_eq!(result, when_blank(temp, RANG));
}
#[test]
fn _when_blank_ran() {
let temp = "사람";
let result = "이란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "책";
let result = "이란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "우주";
let result = "란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "어제";
let result = "란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "google";
let result = "(이)란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "넥슨(코리아)";
let result = "이란";
assert_eq!(result, when_blank(temp, RAN));
let temp = "비타500";
let result = "이란";
assert_eq!(result, when_blank(temp, RAN));
}
#[test]
fn _when_blank_nama() {
let temp = "못하";
let result = "나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "책";
let result = "이나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "몸";
let result = "이나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "힘";
let result = "이나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "google";
let result = "(이)나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "넥슨(코리아)";
let result = "이나마";
assert_eq!(result, when_blank(temp, NAMA));
let temp = "비타500";
let result = "이나마";
assert_eq!(result, when_blank(temp, NAMA));
}
#[test]
fn _when_blank_myeo() {
let temp = "그림";
let result = "이며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "조각";
let result = "이며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "학자";
let result = "며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "정치가";
let result = "며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "google";
let result = "(이)며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "넥슨(코리아)";
let result = "이며";
assert_eq!(result, when_blank(temp, MYEO));
let temp = "비타500";
let result = "이며";
assert_eq!(result, when_blank(temp, MYEO));
}
#[test]
fn _when_blank_yamalro() {
let temp = "삶";
let result = "이야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "조각";
let result = "이야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "한자";
let result = "야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "정치가";
let result = "야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "google";
let result = "(이)야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "넥슨(코리아)";
let result = "이야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
let temp = "비타500";
let result = "이야말로";
assert_eq!(result, when_blank(temp, YAMALRO));
}
#[test]
fn _when_blank_ko() {
let temp = "산";
let result = "이고";
assert_eq!(result, when_blank(temp, KO));
let temp = "강";
let result = "이고";
assert_eq!(result, when_blank(temp, KO));
let temp = "공부";
let result = "고";
assert_eq!(result, when_blank(temp, KO));
let temp = "뭐";
let result = "고";
assert_eq!(result, when_blank(temp, KO));
let temp = "직장에서";
let result = "고";
assert_eq!(result, when_blank(temp, KO));
let temp = "가정에서고";
let result = "고";
assert_eq!(result, when_blank(temp, KO));
let temp = "google";
let result = "(이)고";
assert_eq!(result, when_blank(temp, KO));
let temp = "넥슨(코리아)";
let result = "이고";
assert_eq!(result, when_blank(temp, KO));
let temp = "비타500";
let result = "이고";
assert_eq!(result, when_blank(temp, KO));
}
#[test]
fn _when_blank_ni() {
let temp = "떡";
let result = "이니";
assert_eq!(result, when_blank(temp, NI));
let temp = "과일";
let result = "이니";
assert_eq!(result, when_blank(temp, NI));
let temp = "옥수수";
let result = "니";
assert_eq!(result, when_blank(temp, NI));
let temp = "조";
let result = "니";
assert_eq!(result, when_blank(temp, NI));
let temp = "고추";
let result = "니";
assert_eq!(result, when_blank(temp, NI));
let temp = "google";
let result = "(이)니";
assert_eq!(result, when_blank(temp, NI));
let temp = "넥슨(코리아)";
let result = "이니";
assert_eq!(result, when_blank(temp, NI));
let temp = "비타500";
let result = "이니";
assert_eq!(result, when_blank(temp, NI));
}
#[test]
fn _when_blank_deun() {
let temp = "짐승";
let result = "이든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "사람";
let result = "이든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "사과";
let result = "든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "배";
let result = "든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "고추";
let result = "든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "google";
let result = "(이)든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "넥슨(코리아)";
let result = "이든";
assert_eq!(result, when_blank(temp, DEUN));
let temp = "비타500";
let result = "이든";
assert_eq!(result, when_blank(temp, DEUN));
}
#[test]
fn _when_blank_deunji() {
let temp = "일";
let result = "이든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "짐승";
let result = "이든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "비행기";
let result = "든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "기차";
let result = "든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "google";
let result = "(이)든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "넥슨(코리아)";
let result = "이든지";
assert_eq!(result, when_blank(temp, DEUNJI));
let temp = "비타500";
let result = "이든지";
assert_eq!(result, when_blank(temp, DEUNJI));
}
#[test]
fn _when_blank_deunka() {
let temp = "재작년";
let result = "이든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "작년";
let result = "이든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "운전이라";
let result = "든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "뭐";
let result = "든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "google";
let result = "(이)든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "넥슨(코리아)";
let result = "이든가";
assert_eq!(result, when_blank(temp, DEUNKA));
let temp = "비타500";
let result = "이든가";
assert_eq!(result, when_blank(temp, DEUNKA));
}
#[test]
fn _when_blank_yeo() {
let temp = "슬픔";
let result = "이여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "기쁨";
let result = "이여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "겨레";
let result = "여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "나라";
let result = "여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "google";
let result = "(이)여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "넥슨(코리아)";
let result = "이여";
assert_eq!(result, when_blank(temp, YEO));
let temp = "비타500";
let result = "이여";
assert_eq!(result, when_blank(temp, YEO));
}
#[test]
fn _when_blank_raya() {
let temp = "사람";
let result = "이라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "기쁨";
let result = "이라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "저녁에";
let result = "라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "호랑이";
let result = "라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "google";
let result = "(이)라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "넥슨(코리아)";
let result = "이라야";
assert_eq!(result, when_blank(temp, RAYA));
let temp = "비타500";
let result = "이라야";
assert_eq!(result, when_blank(temp, RAYA));
}
#[test]
fn _when_blank_wa() {
let temp = "얼음";
let result = "과";
assert_eq!(result, when_blank(temp, WA));
let temp = "친구들";
let result = "과";
assert_eq!(result, when_blank(temp, WA));
let temp = "소";
let result = "와";
assert_eq!(result, when_blank(temp, WA));
let temp = "친구";
let result = "와";
assert_eq!(result, when_blank(temp, WA));
let temp = "google";
let result = "(와)과";
assert_eq!(result, when_blank(temp, WA));
let temp = "넥슨(코리아)";
let result = "과";
assert_eq!(result, when_blank(temp, WA));
let temp = "비타500";
let result = "과";
assert_eq!(result, when_blank(temp, WA));
}
#[test]
fn _when_blank_rado() {
let temp = "얼음";
let result = "이라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "친구들";
let result = "이라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "소";
let result = "라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "친구";
let result = "라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "google";
let result = "(이)라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "넥슨(코리아)";
let result = "이라도";
assert_eq!(result, when_blank(temp, RADO));
let temp = "비타500";
let result = "이라도";
assert_eq!(result, when_blank(temp, RADO));
}
}