use crate::{
char_shortcut,
char_struct::KoreanChar,
jauem::{choseong::encode_choseong, jongseong::encode_jongseong},
moeum::jungsong::encode_jungsong,
split::split_korean_jauem,
utils::build_char,
};
fn extend_compound_jongseong(jong1: Option<char>, result: &mut Vec<u8>) -> Result<(), String> {
if let Some(code) = jong1 {
let bytes = encode_jongseong(code)?;
result.extend(bytes);
}
Ok(())
}
pub fn encode_korean_char(korean: &KoreanChar) -> Result<Vec<u8>, String> {
let mut result = Vec::new();
let (cho0, cho1) = split_korean_jauem(korean.cho)?;
if cho1.is_some() {
result.push(32);
}
if let Some(jong) = korean.jong {
let (jong0, jong1) = split_korean_jauem(jong)?;
if let Ok(code) =
char_shortcut::encode_char_shortcut(build_char('ㅇ', korean.jung, Some(jong0)))
{
if cho0 != 'ㅇ' {
result.push(encode_choseong(cho0)?);
}
result.extend(code);
extend_compound_jongseong(jong1, &mut result)?;
} else if let Ok(code) =
char_shortcut::encode_char_shortcut(build_char(cho0, korean.jung, Some(jong0)))
{
result.extend(code);
extend_compound_jongseong(jong1, &mut result)?;
} else if let Ok(code) =
char_shortcut::encode_char_shortcut(build_char(cho0, korean.jung, None))
{
result.extend(code);
result.extend(encode_jongseong(jong)?);
} else {
if cho0 != 'ㅇ' {
result.push(encode_choseong(cho0)?);
}
result.extend(encode_jungsong(korean.jung)?);
result.extend(encode_jongseong(jong)?);
}
} else if let Ok(code) =
char_shortcut::encode_char_shortcut(build_char(cho0, korean.jung, None))
{
result.extend(code);
} else {
if cho0 != 'ㅇ' {
result.push(encode_choseong(cho0)?);
}
result.extend(encode_jungsong(korean.jung)?);
}
Ok(result)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::char_struct::KoreanChar;
#[test]
fn korean_char_encode_various_syllables() {
let kc = KoreanChar {
cho: 'ㄱ',
jung: 'ㅏ',
jong: Some('ㄹ'),
};
let _ = encode_korean_char(&kc);
let kc = KoreanChar {
cho: 'ㄷ',
jung: 'ㅏ',
jong: Some('ㄺ'),
};
let _ = encode_korean_char(&kc);
let kc = KoreanChar {
cho: 'ㄱ',
jung: 'ㅏ',
jong: Some('ㅄ'),
};
let _ = encode_korean_char(&kc);
let kc = KoreanChar {
cho: 'ㄲ',
jung: 'ㅏ',
jong: Some('ㄱ'),
};
let _ = encode_korean_char(&kc);
let _ = crate::encode("값있는 닭의 갈비");
}
}