enum-status-code 0.2.2

Allows attaching status codes to enums
Documentation
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
    );
}