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,
Ya,
Yeo,
Illang,
Ji,
Jiman,
Nikka,
Geon,
Geodeun,
Geona,
Nya,
Ramyeon,
Raseo,
Raneun,
Eyo,
Eotda,
Eoseo,
Rodo,
Roman,
Roneun,
Roui,
Rani,
Randa,
Ramyeonseo,
Radeunka,
Radeunji,
Yo,
Eotdeon,
Ragoneun,
Roseoui,
Others,
}
pub enum TransTossiWhen {
Blank,
RiEulAndBlank,
OnlyKa,
LastJamoNieun,
LastJamoRieul,
Nothing,
}
pub struct Tossi {
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::Illang => TransTossiWhen::LastJamoRieul,
TossiKind::Indeul | TossiKind::Injeuk => TransTossiWhen::LastJamoNieun,
TossiKind::Ka => TransTossiWhen::OnlyKa,
TossiKind::Ro
| TossiKind::Robuteo
| TossiKind::Roseo
| TossiKind::Rosseo
| TossiKind::Rodo
| TossiKind::Roman
| TossiKind::Roneun
| TossiKind::Roui
| TossiKind::Roseoui => TransTossiWhen::RiEulAndBlank,
TossiKind::Others => TransTossiWhen::Nothing,
_ => TransTossiWhen::Blank,
};
Self {
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::Ya,
'지' => TossiKind::Ji,
'건' => TossiKind::Geon,
'냐' => TossiKind::Nya,
'요' => TossiKind::Yo,
_ => 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::Ji,
('지', '만') => TossiKind::Jiman,
('니', '까') => TossiKind::Nikka,
('이', '건') => TossiKind::Geon,
('거', '든') => TossiKind::Geodeun,
('거', '나') => TossiKind::Geona,
('이', '냐') => TossiKind::Nya,
('라', '면') => TossiKind::Ramyeon,
('라', '서') => TossiKind::Raseo,
('라', '는') => TossiKind::Raneun,
('예', '요') => TossiKind::Eyo,
('에', '요') => TossiKind::Eyo,
('였', '다') => TossiKind::Eotda,
('었', '다') => TossiKind::Eotda,
('였', '던') => TossiKind::Eotdeon,
('었', '던') => TossiKind::Eotdeon,
('여', '서') => TossiKind::Eoseo,
('어', '서') => TossiKind::Eoseo,
('로', '도') => TossiKind::Rodo,
('로', '만') => TossiKind::Roman,
('로', '는') => TossiKind::Roneun,
('로', '의') => TossiKind::Roui,
('라', '니') => TossiKind::Rani,
('란', '다') => TossiKind::Randa,
('이', '요') => TossiKind::Yo,
(_, _) => 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::Jiman,
('이', '니', '까') => TossiKind::Nikka,
('이', '거', '든') => TossiKind::Geodeun,
('이', '거', '나') => TossiKind::Geona,
('이', '라', '면') => TossiKind::Ramyeon,
('이', '라', '서') => TossiKind::Raseo,
('이', '라', '는') => TossiKind::Raneun,
('이', '에', '요') => TossiKind::Eyo,
('이', '었', '다') => TossiKind::Eotda,
('이', '었', '던') => TossiKind::Eotdeon,
('이', '어', '서') => TossiKind::Eoseo,
('으', '로', '도') => TossiKind::Rodo,
('으', '로', '만') => TossiKind::Roman,
('으', '로', '는') => TossiKind::Roneun,
('으', '로', '의') => TossiKind::Roui,
('이', '라', '니') => TossiKind::Rani,
('이', '란', '다') => TossiKind::Randa,
('라', '면', '서') => TossiKind::Ramyeonseo,
('라', '든', '가') => TossiKind::Radeunka,
('라', '든', '지') => TossiKind::Radeunji,
('라', '고', '는') => TossiKind::Ragoneun,
('로', '서', '의') => TossiKind::Roseoui,
(_, _, _) => TossiKind::Others,
}
}
fn four_letters(elements: &[char]) -> TossiKind {
match (elements[0], elements[1], elements[2], elements[3]) {
('으', '로', '부', '터') => TossiKind::Robuteo,
('이', '야', '말', '로') => TossiKind::Yamalro,
('이', '라', '면', '서') => TossiKind::Ramyeonseo,
('이', '라', '든', '가') => TossiKind::Radeunka,
('이', '라', '든', '지') => TossiKind::Radeunji,
('이', '라', '고', '는') => TossiKind::Ragoneun,
('으', '로', '서', '의') => TossiKind::Roseoui,
(_, _, _, _) => TossiKind::Others,
}
}