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,
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)
}
}