feat: handle status codes

This commit is contained in:
Valerio Ageno
2024-06-15 12:30:20 +02:00
parent 70b4b9c28f
commit 26c0c2488d
3 changed files with 27 additions and 12 deletions
+12 -5
View File
@@ -22,17 +22,24 @@ impl Props {
http_code: StatusCode::OK,
}
}
pub fn new_with_status(data: impl Serialize + 'static, http_code: StatusCode) -> Self {
Props {
data: Box::new(data),
http_code,
}
}
}
impl Response {
pub fn render_to_string(&self, req: Request) -> impl IntoResponse {
match self {
Self::Props(Props { data, http_code: _ }) => {
Self::Props(Props { data, http_code }) => {
let payload = Payload::new(&req, data).client_payload().unwrap();
match Js::SSR.with(|ssr| ssr.borrow_mut().render_to_string(Some(&payload))) {
Ok(html) => Html(html),
Err(_) => Html("500 Internal server error".to_string()),
Ok(html) => (*http_code, Html(html)),
Err(_) => (*http_code, Html("500 Internal server error".to_string())),
}
}
// TODO: Handle here other enum arms
@@ -42,8 +49,8 @@ impl Response {
pub fn json(&self) -> impl IntoResponse {
match self {
Self::Props(Props { data, http_code: _ }) => Json(data).into_response(),
_ => axum::Json("").into_response(),
Self::Props(Props { data, http_code }) => (*http_code, Json(data)).into_response(),
_ => (StatusCode::INTERNAL_SERVER_ERROR, axum::Json("{}")).into_response(),
}
}
}
+5 -1
View File
@@ -1,3 +1,4 @@
use reqwest::StatusCode;
// src/routes/index.rs
use serde::{Deserialize, Serialize};
use tuono_lib::{Props, Request, Response};
@@ -22,6 +23,9 @@ async fn get_all_pokemons(_req: Request<'_>, fetch: reqwest::Client) -> Response
let data = res.json::<Pokemons>().await.unwrap();
Response::Props(Props::new(data))
}
Err(_err) => Response::Props(Props::new(Pokemons { results: vec![] })),
Err(_err) => Response::Props(Props::new_with_status(
Pokemons { results: vec![] },
StatusCode::INTERNAL_SERVER_ERROR,
)),
};
}
@@ -1,3 +1,4 @@
use reqwest::StatusCode;
use serde::{Deserialize, Serialize};
use tuono_lib::{Props, Request, Response};
@@ -21,11 +22,14 @@ async fn get_pokemon(req: Request<'_>, fetch: reqwest::Client) -> Response {
let data = res.json::<Pokemon>().await.unwrap();
Response::Props(Props::new(data))
}
Err(_err) => Response::Props(Props::new(Pokemon {
name: "Nope".to_string(),
id: 0,
weight: 0,
height: 0,
})),
Err(_err) => Response::Props(Props::new_with_status(
Pokemon {
name: "Nope".to_string(),
id: 0,
weight: 0,
height: 0,
},
StatusCode::INTERNAL_SERVER_ERROR,
)),
};
}