error-http 0.2.2

Procedural macro for associating error enums with HTTP codes.
Documentation
#[cfg(feature = "axum")]
#[cfg(test)]
mod axum {
    use axum::{http::StatusCode, response::IntoResponse};
    use error_http::ToResponse;
    struct SomeStruct {
        _a: i32,
        _b: u32,
    }

    #[derive(ToResponse)]
    enum Error {
        #[code(400)]
        First {
            _a: i32,
            _b: u32,
        },
        #[code(404)]
        #[body("some error message")]
        Blah(SomeStruct, String),
        Third,
        #[code(99)]
        Invalid,
    }

    #[test]
    fn check_error_codes() {
        let error = Error::First { _a: 1, _b: 2 };
        assert_eq!(StatusCode::BAD_REQUEST, error.into_response().status());

        let error = Error::Blah(SomeStruct { _a: 2, _b: 1 }, "something".to_owned());
        assert_eq!(StatusCode::NOT_FOUND, error.into_response().status());

        let error = Error::Third;
        assert_eq!(
            StatusCode::INTERNAL_SERVER_ERROR,
            error.into_response().status()
        );

        let error = Error::Invalid;
        assert_eq!(
            StatusCode::INTERNAL_SERVER_ERROR,
            error.into_response().status()
        );
    }
}

#[cfg(feature = "rocket")]
#[cfg(test)]
mod rocket_test {
    use error_http::ToResponse;
    use rocket::http::Status;
    use rocket::local::blocking::Client;

    struct SomeStruct {
        _a: i32,
        _b: u32,
    }

    #[derive(ToResponse)]
    enum Error {
        #[code(404)]
        #[body("message")]
        Blah(SomeStruct, String),
        Third,
    }

    #[rocket::get("/internal")]
    fn error_internal() -> Error {
        Error::Third
    }

    #[rocket::get("/not_found")]
    fn error_not_found() -> Error {
        Error::Blah(SomeStruct { _a: 1, _b: 0 }, "something".to_owned())
    }

    #[test]
    fn check_error_codes_rocket() {
        let rocket = rocket::build().mount("/", rocket::routes![error_internal, error_not_found]);
        let client = Client::new(rocket).expect("valid rocket instance");

        let response = client.get("/internal").dispatch();
        assert_eq!(response.status(), Status::InternalServerError);

        let response = client.get("/not_found").dispatch();
        assert_eq!(response.status(), Status::NotFound);
    }
}

#[cfg(feature = "actix")]
#[cfg(test)]
mod actix_test {
    use actix_web::ResponseError;
    use error_http::ToResponse;

    #[derive(Debug)]
    struct SomeStruct {
        _a: i32,
        _b: u32,
    }

    #[derive(ToResponse, Debug)]
    enum Error {
        #[code(400)]
        First {
            _a: i32,
            _b: u32,
        },
        #[code(404)]
        #[body("some error message")]
        Blah(SomeStruct, String),
        Third,
        #[code(99)]
        Invalid,
    }

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

    #[test]
    fn check_error_codes_actix() {
        let error = Error::First { _a: 1, _b: 2 };
        assert_eq!(
            actix_web::http::StatusCode::BAD_REQUEST,
            error.error_response().status()
        );

        let error = Error::Blah(SomeStruct { _a: 2, _b: 1 }, "something".to_owned());
        assert_eq!(
            actix_web::http::StatusCode::NOT_FOUND,
            error.error_response().status()
        );

        let error = Error::Third;
        assert_eq!(
            actix_web::http::StatusCode::INTERNAL_SERVER_ERROR,
            error.error_response().status()
        );

        let error = Error::Invalid;
        assert_eq!(
            actix_web::http::StatusCode::INTERNAL_SERVER_ERROR,
            error.error_response().status()
        );
    }
}