summaryrefslogtreecommitdiff
path: root/webapp
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-11-26 13:21:33 -0500
committerKjetil Orbekk <kj@orbekk.com>2022-11-27 17:23:11 -0500
commit8fe6b9755a9c96246e7aa1158ee02becda79aa68 (patch)
tree536105893e893c0af76ffd10778060d49fb62674 /webapp
parent685ac902e3faf4ed5a76b8c859b01f7d2e2d9ea0 (diff)
Improve error reporting when server requests fail
Diffstat (limited to 'webapp')
-rw-r--r--webapp/Cargo.toml1
-rw-r--r--webapp/src/components/app_context_provider.rs12
-rw-r--r--webapp/src/components/table.rs7
-rw-r--r--webapp/src/main.rs1
-rw-r--r--webapp/src/utils.rs10
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?)
+}