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