use std::string::FromUtf8Error;
use axum::{
body::Body,
http::{Response, StatusCode},
response::IntoResponse,
};
use axum_enum_response::EnumIntoResponse;
use futures::StreamExt;
#[derive(serde::Serialize)]
struct UnauthorizedStruct {
a: String,
b: i32,
}
#[derive(EnumIntoResponse)]
enum TestResponse {
#[status_code(OK)]
Ok(#[key("aga")] &'static str),
#[status_code(UNAUTHORIZED)]
Unauthorized(UnauthorizedStruct),
#[status_code(INTERNAL_SERVER_ERROR)]
InternalServerError,
#[status_code(INTERNAL_SERVER_ERROR)]
FromUtf8Error(#[from] FromUtf8Error),
}
async fn get_body(res: Response
) -> String {
let stream = res.into_body().into_data_stream();
String::from_utf8(
stream
.collect::>()
.await
.into_iter()
.map(|v| v.unwrap())
.collect::>()
.concat(),
)
.unwrap()
}
#[tokio::test]
async fn compiles() {
{
let res = TestResponse::Ok("Hello World").into_response();
assert_eq!(res.status(), StatusCode::OK);
let body = get_body(res).await;
assert_eq!(body, "{\"aga\":\"Hello World\"}");
}
{
let res = TestResponse::Unauthorized(UnauthorizedStruct {
a: "Hi".into(),
b: 1337,
})
.into_response();
assert_eq!(res.status(), StatusCode::UNAUTHORIZED);
let body = get_body(res).await;
assert_eq!(body, "{\"a\":\"Hi\",\"b\":1337}");
}
{
let res = TestResponse::InternalServerError.into_response();
assert_eq!(res.status(), StatusCode::INTERNAL_SERVER_ERROR);
let body = get_body(res).await;
assert_eq!(body, "");
}
}