zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
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(()),
        )
    }
}