use crate::filter::filter_only_significant;
pub enum TossiKind {
Deun,
Deunji,
Deunka,
Eul,
Ida,
Indeul,
Injeuk,
Ka,
Ko,
Myeo,
Na,
Nama,
Neun,
Ni,
Rado,
Rago,
Ran,
Rang,
Raya,
Ro,
Robuteo,
Roseo,
Rosseo,
Wa,
Yamalro,
Yeo,
Illang,
Others,
}
pub enum TransTossiWhen {
Blank,
RiEulAndBlank,
OnlyKa,
LastJamoNieun,
LastJamoRieul,
Nothing,
}
pub struct Tossi {
pub modified: Vec<char>,
pub kind: TossiKind,
pub when: TransTossiWhen,
}
impl Tossi {
pub fn new(raw: &str) -> Self {
let temp_modified = filter_only_significant(raw);
let temp_kind = match temp_modified.len() {
1 => one_letter(temp_modified[0]),
2 => two_letters(&temp_modified),
3 => three_letters(&temp_modified),
4 => four_letters(&temp_modified),
_ => TossiKind::Others,
};
let temp_trans_tossi_when = match temp_kind {
TossiKind::Deun => TransTossiWhen::Blank,
TossiKind::Deunji => TransTossiWhen::Blank,
TossiKind::Deunka => TransTossiWhen::Blank,
TossiKind::Eul => TransTossiWhen::Blank,
TossiKind::Ida => TransTossiWhen::Blank,
TossiKind::Illang => TransTossiWhen::LastJamoRieul,
TossiKind::Indeul => TransTossiWhen::LastJamoNieun,
TossiKind::Injeuk => TransTossiWhen::LastJamoNieun,
TossiKind::Ka => TransTossiWhen::OnlyKa,
TossiKind::Ko => TransTossiWhen::Blank,
TossiKind::Myeo => TransTossiWhen::Blank,
TossiKind::Na => TransTossiWhen::Blank,
TossiKind::Nama => TransTossiWhen::Blank,
TossiKind::Neun => TransTossiWhen::Blank,
TossiKind::Ni => TransTossiWhen::Blank,
TossiKind::Rado => TransTossiWhen::Blank,
TossiKind::Rago => TransTossiWhen::Blank,
TossiKind::Ran => TransTossiWhen::Blank,
TossiKind::Rang => TransTossiWhen::Blank,
TossiKind::Raya => TransTossiWhen::Blank,
TossiKind::Ro => TransTossiWhen::RiEulAndBlank,
TossiKind::Robuteo => TransTossiWhen::RiEulAndBlank,
TossiKind::Roseo => TransTossiWhen::RiEulAndBlank,
TossiKind::Rosseo => TransTossiWhen::RiEulAndBlank,
TossiKind::Wa => TransTossiWhen::Blank,
TossiKind::Yamalro => TransTossiWhen::Blank,
TossiKind::Yeo => TransTossiWhen::Blank,
TossiKind::Others => TransTossiWhen::Nothing,
};
Self {
modified: temp_modified,
kind: temp_kind,
when: temp_trans_tossi_when,
}
}
}
fn one_letter(element: char) -> TossiKind {
match element {
'은' | '는' => TossiKind::Neun,
'이' | '가' => TossiKind::Ka,
'을' | '를' => TossiKind::Eul,
'와' | '과' => TossiKind::Wa,
'로' => TossiKind::Ro,
'다' => TossiKind::Ida,
'나' => TossiKind::Na,
'랑' => TossiKind::Rang,
'란' => TossiKind::Ran,
'며' => TossiKind::Myeo,
'고' => TossiKind::Ko,
'니' => TossiKind::Ni,
'든' => TossiKind::Deun,
'여' => TossiKind::Yeo,
_ => TossiKind::Others,
}
}
fn two_letters(elements: &[char]) -> TossiKind {
match (elements[0], elements[1]) {
('으', '로') => TossiKind::Ro,
('로', '서') => TossiKind::Roseo,
('로', '써') => TossiKind::Rosseo,
('이', '다') => TossiKind::Ida,
('이', '나') => TossiKind::Na,
('이', '랑') => TossiKind::Rang,
('이', '란') => TossiKind::Ran,
('나', '마') => TossiKind::Nama,
('이', '며') => TossiKind::Myeo,
('이', '고') => TossiKind::Ko,
('이', '니') => TossiKind::Ni,
('이', '든') => TossiKind::Deun,
('든', '지') => TossiKind::Deunji,
('든', '가') => TossiKind::Deunka,
('이', '여') => TossiKind::Yeo,
('라', '야') => TossiKind::Raya,
('라', '도') => TossiKind::Rado,
('인', '들') => TossiKind::Indeul,
('인', '즉') => TossiKind::Injeuk,
('라', '고') => TossiKind::Rago,
('일', '랑') => TossiKind::Illang,
(_, _) => TossiKind::Others,
}
}
fn three_letters(elements: &[char]) -> TossiKind {
match (elements[0], elements[1], elements[2]) {
('으', '로', '서') => TossiKind::Roseo,
('으', '로', '써') => TossiKind::Rosseo,
('로', '부', '터') => TossiKind::Robuteo,
('이', '나', '마') => TossiKind::Nama,
('야', '말', '로') => TossiKind::Yamalro,
('이', '든', '지') => TossiKind::Deunji,
('이', '든', '가') => TossiKind::Deunka,
('이', '라', '야') => TossiKind::Raya,
('이', '라', '도') => TossiKind::Rado,
('이', '라', '고') => TossiKind::Rago,
(_, _, _) => TossiKind::Others,
}
}
fn four_letters(elements: &[char]) -> TossiKind {
match (elements[0], elements[1], elements[2], elements[3]) {
('으', '로', '부', '터') => TossiKind::Robuteo,
('이', '야', '말', '로') => TossiKind::Yamalro,
(_, _, _, _) => TossiKind::Others,
}
}