diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-11-26 13:21:33 -0500 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-11-27 17:23:11 -0500 |
commit | 8fe6b9755a9c96246e7aa1158ee02becda79aa68 (patch) | |
tree | 536105893e893c0af76ffd10778060d49fb62674 /webapp | |
parent | 685ac902e3faf4ed5a76b8c859b01f7d2e2d9ea0 (diff) |
Improve error reporting when server requests fail
Diffstat (limited to 'webapp')
-rw-r--r-- | webapp/Cargo.toml | 1 | ||||
-rw-r--r-- | webapp/src/components/app_context_provider.rs | 12 | ||||
-rw-r--r-- | webapp/src/components/table.rs | 7 | ||||
-rw-r--r-- | webapp/src/main.rs | 1 | ||||
-rw-r--r-- | webapp/src/utils.rs | 10 |
5 files changed, 22 insertions, 9 deletions
diff --git a/webapp/Cargo.toml b/webapp/Cargo.toml index fe1d53b..255dd45 100644 --- a/webapp/Cargo.toml +++ b/webapp/Cargo.toml @@ -20,6 +20,7 @@ yew-router = "0.16.0" web-sys = { version = "0.3.60", features = ["Location", "Document"] } uuid = { version = "1.2.1", features = ["serde"] } rand = "0.8.4" +serde = "1.0.147" [dev-dependencies] env_logger = "0.8.4" 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<Option<UserInfo>, 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<Option<UserInfo>, 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<T>(response: Response) -> Result<T, anyhow::Error> +where T: DeserializeOwned { + if !response.ok() { + anyhow::bail!("Request failed: {} {}", response.status(), response.status_text()); + } + Ok(response.json().await?) +} |