use enum_status_code::{AsStatusCode, status_code};
use http::StatusCode;
#[test]
pub fn test_non_default() {
#[status_code]
pub enum Error {
#[code(StatusCode::NOT_FOUND)]
NotFound,
#[code(StatusCode::INTERNAL_SERVER_ERROR)]
InternalServerError,
}
assert_eq!(Error::NotFound.as_status_code(), StatusCode::NOT_FOUND);
assert_eq!(
Error::InternalServerError.as_status_code(),
StatusCode::INTERNAL_SERVER_ERROR
);
}
#[test]
pub fn test_default() {
#[status_code(StatusCode::INTERNAL_SERVER_ERROR)]
pub enum Error {
#[code(StatusCode::NOT_FOUND)]
NotFound,
InternalServerError,
}
assert_eq!(Error::NotFound.as_status_code(), StatusCode::NOT_FOUND);
assert_eq!(
Error::InternalServerError.as_status_code(),
StatusCode::INTERNAL_SERVER_ERROR
);
}
#[cfg(test)]
fn get_status_code(_: &TestCallError) -> StatusCode {
return StatusCode::NOT_FOUND;
}
#[status_code]
pub enum TestCallError {
#[code(get_status_code(self))]
NotFound,
}
#[test]
pub fn test_call() {
assert_eq!(
TestCallError::NotFound.as_status_code(),
StatusCode::NOT_FOUND
);
}
#[test]
pub fn test_const_generics() {
#[status_code]
pub enum Error<const STATUS_CODE: u16> {
#[code(
StatusCode::try_from(STATUS_CODE).unwrap()
)]
NotFound,
}
assert_eq!(
Error::<404>::NotFound.as_status_code(),
StatusCode::NOT_FOUND
);
}
#[test]
pub fn test_where_clause() {
pub trait StatusCodeProvider {
fn status_code(&self) -> StatusCode;
}
pub struct NotFound;
impl StatusCodeProvider for NotFound {
fn status_code(&self) -> StatusCode {
StatusCode::NOT_FOUND
}
}
#[status_code]
pub enum Error<M>
where
M: StatusCodeProvider,
{
#[pattern((status))]
#[code(
StatusCode::try_from(status.status_code()).unwrap()
)]
NotFound(M),
#[pattern((status))]
#[code(*status)]
NotFoundCode(StatusCode),
#[pattern({status})]
#[code(*status)]
NotFoundStruct { status: StatusCode },
}
assert_eq!(
Error::<NotFound>::NotFound(NotFound).as_status_code(),
StatusCode::NOT_FOUND
);
assert_eq!(
Error::NotFoundCode::<NotFound>(StatusCode::NOT_FOUND).as_status_code(),
StatusCode::NOT_FOUND
);
assert_eq!(
Error::NotFoundStruct::<NotFound> {
status: StatusCode::NOT_FOUND
}
.as_status_code(),
StatusCode::NOT_FOUND
);
}