zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct UserId(pub String);

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct Agent(pub String);

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct Language(pub String);

#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
pub enum Requestor {
    Anonymous(String),
    LoginUser(UserDetails),
    JwtUser(UserDetails),
    InnerService(UserDetails),
}

#[derive(
    Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash,
)]
pub struct UserDetails {
    pub user_id: String,
    pub user_name: String,
    pub nick_name: String,
    pub user_role: String,
    pub resource_id: String,
}

#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct UserInfo {
    pub user_id: String,
    pub user_name: String,
    pub nick_name: String,
    pub user_role: String,
    pub head_image: String,
}

impl Requestor {
    pub fn get_user(&self) -> Option<&UserDetails> {
        match self {
            Requestor::Anonymous(_) => None,
            Requestor::LoginUser(user_detail) => Some(user_detail),
            Requestor::JwtUser(user_detail) => Some(user_detail),
            Requestor::InnerService(_) => todo!(),
        }
    }

    pub fn user(&self) -> &UserDetails {
        match self {
            Requestor::Anonymous(_) => panic!("user not login!"),
            Requestor::LoginUser(user_detail) => user_detail,
            Requestor::JwtUser(user_detail) => user_detail,
            Requestor::InnerService(_) => todo!(),
        }
    }
}

impl UserDetails {
    pub fn user_id(&self) -> String {
        self.user_id.to_string()
    }
}

impl UserInfo {
    pub fn build(user_details: &UserDetails) -> Self {
        Self {
            user_id: user_details.user_id.to_owned(),
            user_name: user_details.user_name.to_owned(),
            nick_name: user_details.nick_name.to_owned(),
            user_role: user_details.user_role.to_owned(),
            head_image: format!("/m/pp/{}", user_details.resource_id),
        }
    }
}

impl std::fmt::Display for UserId {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        self.0.fmt(f)
    }
}

impl std::fmt::Display for Agent {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        self.0.fmt(f)
    }
}

impl std::fmt::Display for Language {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        self.0.fmt(f)
    }
}