sejong 0.1.5

Sejong Buffer is a buffer that can receive ASCII bytes different from keyboard and send out UTF-32 Hangul string. This buffer allows deletion by Jamo.
Documentation
use super::Byte;
use std::convert::TryFrom;

#[derive(Clone, Copy, PartialEq, Debug)]
#[repr(u8)]
pub(crate) enum MedialVowel {
    A,   //    AE,  //    YA,  //    YAE, //    EO,  //    E,   //    YEO, //    YE,  //    O,   //    WA,  //    WAE, //    OE,  //    YO,  //    U,   //    WO,  //    WE,  //    WI,  //    YU,  //    EU,  //    YI,  //    I,   //}

impl TryFrom<Byte> for MedialVowel {
    type Error = Byte;
    fn try_from(b: Byte) -> Result<Self, Self::Error> {
        match b {
            Byte::A => Ok(Self::A),
            Byte::AE => Ok(Self::AE),
            Byte::YA => Ok(Self::YA),
            Byte::YAE => Ok(Self::YAE),
            Byte::EO => Ok(Self::EO),
            Byte::E => Ok(Self::E),
            Byte::YEO => Ok(Self::YEO),
            Byte::YE => Ok(Self::YE),
            Byte::O => Ok(Self::O),
            Byte::YO => Ok(Self::YO),
            Byte::U => Ok(Self::U),
            Byte::YU => Ok(Self::YU),
            Byte::EU => Ok(Self::EU),
            Byte::I => Ok(Self::I),
            _ => Err(b),
        }
    }
}

impl Default for MedialVowel {
    fn default() -> Self {
        Self::A
    }
}

impl Into<char> for MedialVowel {
    fn into(self) -> char {
        unsafe {
            let x = std::char::from_u32_unchecked(self as u32 + 0x314f);
            x
        }
    }
}

impl TryFrom<(Self, Byte)> for MedialVowel {
    type Error = (Self, Byte);
    fn try_from(input: (Self, Byte)) -> Result<Self, Self::Error> {
        match input.0 {
            Self::O => match input.1 {
                Byte::A => Ok(Self::WA),
                Byte::AE => Ok(Self::WAE),
                Byte::I => Ok(Self::OE),
                _ => Err(input),
            },
            Self::U => match input.1 {
                Byte::EO => Ok(Self::WO),
                Byte::E => Ok(Self::WE),
                Byte::I => Ok(Self::WI),
                _ => Err(input),
            },
            Self::EU => match input.1 {
                Byte::I => Ok(Self::YI),
                _ => Err(input),
            },
            _ => Err(input),
        }
    }
}

impl MedialVowel {
    pub fn try_remove_second_half(self) -> Option<Self> {
        match self {
            Self::WA | Self::WAE | Self::OE => Some(Self::O),
            Self::WO | Self::WE | Self::WI => Some(Self::U),
            Self::YI => Some(Self::EU),
            _ => None,
        }
    }
}