From 8fe6b9755a9c96246e7aa1158ee02becda79aa68 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sat, 26 Nov 2022 13:21:33 -0500 Subject: Improve error reporting when server requests fail --- webapp/src/components/app_context_provider.rs | 12 ++++++------ webapp/src/components/table.rs | 7 ++++--- webapp/src/main.rs | 1 + webapp/src/utils.rs | 10 ++++++++++ 4 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 webapp/src/utils.rs (limited to 'webapp/src') diff --git a/webapp/src/components/app_context_provider.rs b/webapp/src/components/app_context_provider.rs index 4c9e18f..7ca0cf3 100644 --- a/webapp/src/components/app_context_provider.rs +++ b/webapp/src/components/app_context_provider.rs @@ -1,5 +1,5 @@ use log::error; -use crate::routing::Route; +use crate::{routing::Route, utils::ok_json}; use gloo_net::http::Request; use log::info; use protocol::UserInfo; @@ -8,6 +8,7 @@ use std::future::Future; use wasm_bindgen_futures::spawn_local; use yew::prelude::*; use yew_router::prelude::*; +use anyhow::Context; #[derive(Properties, Clone, PartialEq, Debug)] pub struct ErrorInfoProperties { @@ -36,7 +37,7 @@ impl AppContext { if let Err(err) = f.await { error!("Error occurred: {err:?}"); error.set(Some(ErrorInfoProperties { - message: format!("Some error occured: {:?}", err), + message: format!("{err:?}"), })); } }); @@ -55,7 +56,7 @@ impl AppContext { let history = self.history.clone(); self.spawn_async(async move { let response = Request::post("/api/table").send().await?; - let table_id: Uuid = response.json().await?; + let table_id: Uuid = ok_json(response).await.context("creating table")?; info!("Created table {table_id}"); if let Some(user_info) = user.as_ref() { user.set(Some(UserInfo { @@ -94,7 +95,7 @@ pub struct Props { } async fn initialize_user_info() -> Result, anyhow::Error> { - let response = Request::get("/api/user/info").send().await?; + let response = Request::get("/api/user/info").send().await.context("fetching user_info")?; if response.status() == 401 { web_sys::window() .unwrap() @@ -102,8 +103,7 @@ async fn initialize_user_info() -> Result, anyhow::Error> { .assign("/api/login") .unwrap(); }; - let user_info = response.json().await?; - Ok(user_info) + Ok(ok_json(response).await.context("requesting user_info")?) } pub fn use_app_context() -> AppContext { diff --git a/webapp/src/components/table.rs b/webapp/src/components/table.rs index c4f693e..a874a93 100644 --- a/webapp/src/components/table.rs +++ b/webapp/src/components/table.rs @@ -4,6 +4,8 @@ use protocol::bridge_engine::GameStatePlayerView; use yew::prelude::*; use crate::use_app_context; use crate::components::Hand; +use crate::utils::ok_json; +use anyhow::Context; #[function_component(OnlineTable)] pub fn online_table(props: &OnlineTableProps) -> Html { @@ -20,9 +22,8 @@ pub fn online_table(props: &OnlineTableProps) -> Html { ctx.spawn_async(async move { let response = Request::get(&format!("/api/table/{}", props.table.id)) .send() - .await?; - // info!("Got response: {:#?}", response.body()); - let table = response.json().await?; + .await.context("fetching table data")?; + let table = ok_json(response).await?; table_state.set(Some(table)); Ok(()) }); diff --git a/webapp/src/main.rs b/webapp/src/main.rs index 72d0d29..f99dfe0 100644 --- a/webapp/src/main.rs +++ b/webapp/src/main.rs @@ -3,6 +3,7 @@ use log::{debug, error, info, warn}; use yew::prelude::*; use yew_router::prelude::*; pub mod components; +pub mod utils; use components::{AppContextProvider, ErrorInfo, Game, OnlineTable}; extern crate wee_alloc; pub mod routing; diff --git a/webapp/src/utils.rs b/webapp/src/utils.rs new file mode 100644 index 0000000..1eadf2f --- /dev/null +++ b/webapp/src/utils.rs @@ -0,0 +1,10 @@ +use gloo_net::http::Response; +use serde::de::DeserializeOwned; + +pub async fn ok_json(response: Response) -> Result +where T: DeserializeOwned { + if !response.ok() { + anyhow::bail!("Request failed: {} {}", response.status(), response.status_text()); + } + Ok(response.json().await?) +} -- cgit v1.2.3