imservice: Use TryFrom for u32->enum conversions
This commit is contained in:
		@ -5,6 +5,10 @@ use std::string::String;
 | 
			
		||||
 | 
			
		||||
use super::bitflags;
 | 
			
		||||
 | 
			
		||||
// Traits
 | 
			
		||||
use std::convert::TryFrom;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Gathers stuff defined in C or called by C
 | 
			
		||||
pub mod c {
 | 
			
		||||
    use super::*;
 | 
			
		||||
@ -108,8 +112,8 @@ pub mod c {
 | 
			
		||||
                })
 | 
			
		||||
            },
 | 
			
		||||
            content_purpose: {
 | 
			
		||||
                ContentPurpose::from_num(purpose).unwrap_or_else(|| {
 | 
			
		||||
                    eprintln!("Warning: Received invalid purpose flags");
 | 
			
		||||
                ContentPurpose::try_from(purpose).unwrap_or_else(|_e| {
 | 
			
		||||
                    eprintln!("Warning: Received invalid purpose value");
 | 
			
		||||
                    ContentPurpose::Normal
 | 
			
		||||
                })
 | 
			
		||||
            },
 | 
			
		||||
@ -126,8 +130,8 @@ pub mod c {
 | 
			
		||||
        let imservice = &mut *imservice;
 | 
			
		||||
        imservice.pending = IMProtocolState {
 | 
			
		||||
            text_change_cause: {
 | 
			
		||||
                ChangeCause::from_num(cause).unwrap_or_else(|| {
 | 
			
		||||
                    eprintln!("Warning: received invalid cause flags");
 | 
			
		||||
                ChangeCause::try_from(cause).unwrap_or_else(|_e| {
 | 
			
		||||
                    eprintln!("Warning: received invalid cause value");
 | 
			
		||||
                    ChangeCause::InputMethod
 | 
			
		||||
                })
 | 
			
		||||
            },
 | 
			
		||||
@ -222,25 +226,28 @@ pub enum ContentPurpose {
 | 
			
		||||
    Terminal = 13,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ContentPurpose {
 | 
			
		||||
    fn from_num(num: u32) -> Option<ContentPurpose> {
 | 
			
		||||
impl TryFrom<u32> for ContentPurpose {
 | 
			
		||||
    // There's only one way to fail: number not in protocol,
 | 
			
		||||
    // so no special error type is needed
 | 
			
		||||
    type Error = ();
 | 
			
		||||
    fn try_from(num: u32) -> Result<Self, Self::Error> {
 | 
			
		||||
        use self::ContentPurpose::*;
 | 
			
		||||
        match num {
 | 
			
		||||
            0 => Some(Normal),
 | 
			
		||||
            1 => Some(Alpha),
 | 
			
		||||
            2 => Some(Digits),
 | 
			
		||||
            3 => Some(Number),
 | 
			
		||||
            4 => Some(Phone),
 | 
			
		||||
            5 => Some(Url),
 | 
			
		||||
            6 => Some(Email),
 | 
			
		||||
            7 => Some(Name),
 | 
			
		||||
            8 => Some(Password),
 | 
			
		||||
            9 => Some(Pin),
 | 
			
		||||
            10 => Some(Date),
 | 
			
		||||
            11 => Some(Time),
 | 
			
		||||
            12 => Some(Datetime),
 | 
			
		||||
            13 => Some(Terminal),
 | 
			
		||||
            _ => None,
 | 
			
		||||
            0 => Ok(Normal),
 | 
			
		||||
            1 => Ok(Alpha),
 | 
			
		||||
            2 => Ok(Digits),
 | 
			
		||||
            3 => Ok(Number),
 | 
			
		||||
            4 => Ok(Phone),
 | 
			
		||||
            5 => Ok(Url),
 | 
			
		||||
            6 => Ok(Email),
 | 
			
		||||
            7 => Ok(Name),
 | 
			
		||||
            8 => Ok(Password),
 | 
			
		||||
            9 => Ok(Pin),
 | 
			
		||||
            10 => Ok(Date),
 | 
			
		||||
            11 => Ok(Time),
 | 
			
		||||
            12 => Ok(Datetime),
 | 
			
		||||
            13 => Ok(Terminal),
 | 
			
		||||
            _ => Err(()),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -252,12 +259,15 @@ pub enum ChangeCause {
 | 
			
		||||
    Other = 1,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ChangeCause {
 | 
			
		||||
    pub fn from_num(num: u32) -> Option<ChangeCause> {
 | 
			
		||||
impl TryFrom<u32> for ChangeCause {
 | 
			
		||||
    // There's only one way to fail: number not in protocol,
 | 
			
		||||
    // so no special error type is needed
 | 
			
		||||
    type Error = ();
 | 
			
		||||
    fn try_from(num: u32) -> Result<Self, Self::Error> {
 | 
			
		||||
        match num {
 | 
			
		||||
            0 => Some(ChangeCause::InputMethod),
 | 
			
		||||
            1 => Some(ChangeCause::Other),
 | 
			
		||||
            _ => None
 | 
			
		||||
            0 => Ok(ChangeCause::InputMethod),
 | 
			
		||||
            1 => Ok(ChangeCause::Other),
 | 
			
		||||
            _ => Err(())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user