tina-core 0.0.2

Tina platform
Documentation
//! 返回状态码
use crate::tina::data::i18n_string::I18nString;
use crate::tina::data::return_code::IReturnCode;
use crate::tina::i18n::ResourceBundle;
use std::fmt::{Display, Formatter};
use std::sync::Arc;

/// 返回码
#[derive(Debug, Clone, Copy)]
pub enum HttpStatus {
    /// 操作成功
    Success,
    /// 对象创建成功
    Created,
    /// 请求已经被接受
    Accepted,
    /// 操作已经执行成功,但是没有返回数据
    NoContent,
    /// 资源已被移除
    MovedPerm,
    /// 重定向
    SeeOther,
    /// 资源没有被修改
    NotModified,
    /// 参数列表错误(缺少,格式不匹配)
    BadRequest,
    /// 未授权
    Unauthorized,
    /// 访问受限,授权过期
    Forbidden,
    /// 资源,服务未找到
    NotFound,
    /// 不允许的http方法
    BadMethod,
    /// 资源冲突,或者资源被锁
    Conflict,
    /// 不支持的数据,媒体类型
    UnsupportedType,
    /// 系统内部错误
    Error,
    /// 接口未实现
    NotImplemented,
    /// 未绑定谷歌身份验证
    NoAuthenticator,
    /// 未知错误
    Unkown,
}

impl Display for HttpStatus {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str(self.get_code_description().get_string(ResourceBundle::get_default_locale().as_str()).as_str())
    }
}

impl IReturnCode for HttpStatus {
    fn items() -> Vec<Arc<dyn IReturnCode>>
    where
        Self: Sized,
    {
        vec![
            Arc::new(HttpStatus::Success),
            Arc::new(HttpStatus::Created),
            Arc::new(HttpStatus::Accepted),
            Arc::new(HttpStatus::NoContent),
            Arc::new(HttpStatus::MovedPerm),
            Arc::new(HttpStatus::SeeOther),
            Arc::new(HttpStatus::NotModified),
            Arc::new(HttpStatus::BadRequest),
            Arc::new(HttpStatus::Unauthorized),
            Arc::new(HttpStatus::Forbidden),
            Arc::new(HttpStatus::NotFound),
            Arc::new(HttpStatus::BadMethod),
            Arc::new(HttpStatus::Conflict),
            Arc::new(HttpStatus::UnsupportedType),
            Arc::new(HttpStatus::Error),
            Arc::new(HttpStatus::NotImplemented),
            Arc::new(HttpStatus::NoAuthenticator),
            Arc::new(HttpStatus::Unkown),
        ]
    }

    fn get_default() -> Arc<dyn IReturnCode>
    where
        Self: Sized,
    {
        Arc::new(HttpStatus::NotImplemented)
    }

    fn is_success(&self) -> bool {
        self.get_code() == HttpStatus::Success.get_code()
    }

    fn get_code(&self) -> i32 {
        match self {
            HttpStatus::Success => 200,
            HttpStatus::Created => 201,
            HttpStatus::Accepted => 202,
            HttpStatus::NoContent => 204,
            HttpStatus::MovedPerm => 301,
            HttpStatus::SeeOther => 303,
            HttpStatus::NotModified => 304,
            HttpStatus::BadRequest => 400,
            HttpStatus::Unauthorized => 401,
            HttpStatus::Forbidden => 403,
            HttpStatus::NotFound => 404,
            HttpStatus::BadMethod => 405,
            HttpStatus::Conflict => 409,
            HttpStatus::UnsupportedType => 415,
            HttpStatus::Error => 500,
            HttpStatus::NotImplemented => 501,
            HttpStatus::NoAuthenticator => 407,
            HttpStatus::Unkown => 9999,
        }
    }

    fn get_code_description(&self) -> I18nString {
        let key = format!("message.http_status_{}", self.get_code());
        I18nString::from_key(key)
    }
}