use std::str::FromStr;
pub static USER_GENDER_NAMES: [&str; 3] = [
"", "man", "woman", ];
#[repr(usize)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub enum UserGender {
None,
Man,
Woman,
}
impl UserGender {
fn from_usize(u: usize) -> Option<UserGender> {
match u {
0 => Some(UserGender::None),
1 => Some(UserGender::Man),
2 => Some(UserGender::Woman),
_ => None,
}
}
pub fn as_str(&self) -> &'static str {
USER_GENDER_NAMES[*self as usize]
}
pub fn iter() -> impl Iterator<Item = Self> {
(0..2).map(|i| Self::from_usize(i).unwrap())
}
}
#[allow(missing_copy_implementations)]
#[derive(Debug, PartialEq, Eq)]
pub struct ParseUserGenderError(());
fn ok_or<T, E>(t: Option<T>, e: E) -> Result<T, E> {
match t {
Some(t) => Ok(t),
None => Err(e),
}
}
impl FromStr for UserGender {
type Err = ParseUserGenderError;
fn from_str(types: &str) -> Result<UserGender, Self::Err> {
ok_or(
USER_GENDER_NAMES
.iter()
.position(|&name| name.eq_ignore_ascii_case(types.trim()))
.map(|p| UserGender::from_usize(p).unwrap()),
ParseUserGenderError(()),
)
}
}