From d86d0d2f3235d28967919fb5ebdb7e55740694b7 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Wed, 28 Jan 2026 22:02:11 +0100 Subject: [PATCH] Starts working on an Error flash. --- backend-actix/Cargo.lock | 156 ++++++++++++++-------------- backend-actix/src/request/error.rs | 1 - gamenight-cli/src/flows/add_game.rs | 26 ++++- gamenight-cli/src/flows/connect.rs | 22 ++-- gamenight-cli/src/flows/mod.rs | 55 +++++----- gamenight-database/src/error.rs | 6 +- 6 files changed, 143 insertions(+), 123 deletions(-) diff --git a/backend-actix/Cargo.lock b/backend-actix/Cargo.lock index 95bdba6..4662ca5 100644 --- a/backend-actix/Cargo.lock +++ b/backend-actix/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.1", + "socket2 0.6.2", "time", "tracing", "url", @@ -338,9 +338,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d809780667f4410e7c41b07f52439b94d2bdf8528eeedc287fa38d3b7f95d82" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" @@ -416,9 +416,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.51" +version = "1.2.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" dependencies = [ "find-msvc-tools", "jobserver", @@ -434,9 +434,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -666,9 +666,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.3.5" +version = "2.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e130c806dccc85428c564f2dc5a96e05b6615a27c9a28776bd7761a9af4bb552" +checksum = "d9b6c2fc184a6fb6ebcf5f9a5e3bbfa84d8fd268cdfcce4ed508979a6259494d" dependencies = [ "bitflags", "byteorder", @@ -695,9 +695,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.3.6" +version = "2.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c30b2969f923fa1f73744b92bb7df60b858df8832742d9a3aceb79236c0be1d2" +checksum = "47618bf0fac06bb670c036e48404c26a865e6a71af4114dfd97dfe89936e404e" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -900,15 +900,15 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" +checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" dependencies = [ "crc32fast", "miniz_oxide", @@ -975,7 +975,7 @@ dependencies = [ "diesel", "diesel-derive-enum", "diesel_migrations", - "rand_core 0.9.3", + "rand_core 0.9.5", "serde", "uuid", ] @@ -993,9 +993,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", @@ -1105,9 +1105,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1299,9 +1299,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.83" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ "once_cell", "wasm-bindgen", @@ -1309,13 +1309,13 @@ dependencies = [ [[package]] name = "jsonwebtoken" -version = "10.2.0" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" +checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ "base64", "ed25519-dalek", - "getrandom 0.2.16", + "getrandom 0.2.17", "hmac", "js-sys", "p256", @@ -1347,15 +1347,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.179" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "litemap" @@ -1484,9 +1484,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-integer" @@ -1755,18 +1755,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -1806,7 +1806,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -1826,7 +1826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -1835,14 +1835,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", ] @@ -2131,9 +2131,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -2197,18 +2197,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2217,30 +2217,30 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" dependencies = [ "num-conv", "time-core", @@ -2268,7 +2268,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "windows-sys 0.61.2", ] @@ -2287,9 +2287,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.10+spec-1.1.0" +version = "0.9.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" dependencies = [ "serde_core", "serde_spanned", @@ -2330,9 +2330,9 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.7.20" +version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f28f45dd524790b44a7b372f7c3aec04a3af6b42d494e861b67de654cb25a5e" +checksum = "1ca6b15407f9bfcb35f82d0e79e603e1629ece4e91cc6d9e58f890c184dd20af" dependencies = [ "actix-web", "mutually_exclusive_features", @@ -2411,9 +2411,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -2471,18 +2471,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", @@ -2493,9 +2493,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2503,9 +2503,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ "bumpalo", "proc-macro2", @@ -2516,9 +2516,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.106" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" dependencies = [ "unicode-ident", ] @@ -2746,9 +2746,9 @@ checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "writeable" @@ -2781,18 +2781,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22" dependencies = [ "proc-macro2", "quote", @@ -2861,9 +2861,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.12" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" +checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" [[package]] name = "zstd" diff --git a/backend-actix/src/request/error.rs b/backend-actix/src/request/error.rs index 55d108d..2abe4e4 100644 --- a/backend-actix/src/request/error.rs +++ b/backend-actix/src/request/error.rs @@ -33,7 +33,6 @@ impl ResponseError for ApiError { impl From for ApiError { fn from(value: DatabaseError) -> Self { ApiError { - //Todo, split this in unrecoverable and schema error status: 500, message: value.0, } diff --git a/gamenight-cli/src/flows/add_game.rs b/gamenight-cli/src/flows/add_game.rs index a5c33b0..c1f7a30 100644 --- a/gamenight-cli/src/flows/add_game.rs +++ b/gamenight-cli/src/flows/add_game.rs @@ -1,11 +1,11 @@ -use std::fmt::Display; - use super::*; use crate::flows::own::Own; use async_trait::async_trait; +use gamenight_api_client_rs::apis::default_api::PostGamesError; use gamenight_api_client_rs::models::AddGameRequestBody; use inquire::Text; - +use serde_json::Value; +use std::fmt::Display; #[derive(Clone)] pub struct AddGame { @@ -24,7 +24,13 @@ impl<'a> Flow<'a> for AddGame { let add_game_request = AddGameRequestBody { name }; - let game_id_response = state.api.post_games(Some(add_game_request)).await?; + let game_id_response = match state.api.post_games(Some(add_game_request)).await { + Ok(x) => x, + Err(x) => { + let error_string = get_error_message::(&x)?; + return create_error_flow_result(async |state| {Ok((FlowOutcome::Successful, state))}, x, state, error_string); + } + }; let own_flow = Own::new(Uuid::parse_str(&game_id_response.game_id)?); return self.continue_with(state, &own_flow).await; @@ -33,6 +39,18 @@ impl<'a> Flow<'a> for AddGame { } } +fn get_error_message(error: &Error) -> Result { + match error { + Error::Reqwest(x) => {Ok(x.to_string())} + Error::Serde(x) => {Ok(x.to_string())} + Error::Io(x) => {Ok(x.to_string())} + Error::ResponseError(inner) => { + let json : Value = serde_json::from_str(&inner.content)?; + Ok(json["message"].to_string()) + } + } +} + impl Display for AddGame { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Add Game") diff --git a/gamenight-cli/src/flows/connect.rs b/gamenight-cli/src/flows/connect.rs index c7c5d45..8ae3f68 100644 --- a/gamenight-cli/src/flows/connect.rs +++ b/gamenight-cli/src/flows/connect.rs @@ -84,7 +84,7 @@ impl Connect { #[async_trait] impl<'a> Flow<'a> for Connect { - async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { + async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> where FlowResult<'a> : Send { let mut instance = if let Some(instance) = self.instance.clone() { instance } else if let Some(instance) = self.prompt_new_instance(&state.gamenight_configuration)? { @@ -106,20 +106,16 @@ impl<'a> Flow<'a> for Connect { let login_flow = Login::new(); let (outcome, state) = login_flow.run(state).await?; - if outcome == FlowOutcome::Successful { - self.update_state_on_logon(&mut instance, state, &instance_name)?; - - let gamenight_menu_flow = GamenightMenu::new(); - gamenight_menu_flow.run(state).await - } - else { - Ok((outcome, state)) + match outcome { + FlowOutcome::Successful => { + self.update_state_on_logon(&mut instance, state, &instance_name)?; + + let gamenight_menu_flow = GamenightMenu::new(); + gamenight_menu_flow.run(state).await + }, + _ => Ok((outcome, state)) } } - - - - } } diff --git a/gamenight-cli/src/flows/mod.rs b/gamenight-cli/src/flows/mod.rs index fd58132..9701a6e 100644 --- a/gamenight-cli/src/flows/mod.rs +++ b/gamenight-cli/src/flows/mod.rs @@ -1,5 +1,6 @@ use gamenight_api_client_rs::apis::default_api::{DefaultApi, DefaultApiClient}; use std::{fmt::Display, num::ParseIntError}; +use std::pin::Pin; use std::sync::{Arc, MutexGuard, PoisonError}; use async_trait::async_trait; use chrono::ParseError; @@ -157,22 +158,6 @@ impl From for FlowError { } } -impl From> for FlowError { - fn from(value: PoisonError<&mut Configuration>) -> Self { - Self { - error: value.to_string() - } - } -} - -impl From> for FlowError { - fn from(value: PoisonError) -> Self { - Self { - error: value.to_string() - } - } -} - impl From>> for FlowError { fn from(value: PoisonError>) -> Self { Self { @@ -181,14 +166,32 @@ impl From>> for FlowError { } } -#[derive(PartialEq)] -pub enum FlowOutcome { +impl From for FlowError { + fn from(value: serde_json::Error) -> Self { + Self { + error: value.to_string() + } + } +} + +pub enum FlowOutcome<'a> { Successful, Cancelled, + Error(Box Pin + Send + 'a>> + Send>, String), Abort, } -type FlowResult<'a> = Result<(FlowOutcome, &'a mut GamenightState), FlowError>; +unsafe impl Send for FlowOutcome<'_> { } + +type FlowResult<'a> = Result<(FlowOutcome<'a>, &'a mut GamenightState), FlowError>; + +fn create_error_flow_result<'a, F, Fut, T>(f: F, _error: Error, state: &'a mut GamenightState, error_string: String) -> FlowResult<'a> +where + F: Fn(&'a mut GamenightState) -> Fut + 'static + Send, + Fut: Future> + 'a + Send, +{ + Ok((FlowOutcome::Error(Box::new(move |state| Box::pin(f(state))), error_string), state)) +} dyn_clone::clone_trait_object!(for<'a> Flow<'a>); @@ -198,13 +201,15 @@ pub trait Flow<'a>: Sync + DynClone + Send + Display { clear_screen::clear(); if let Some(choice) = choice { let (outcome, new_state) = choice.run(state).await?; - - if outcome == FlowOutcome::Abort { - Ok((FlowOutcome::Successful, new_state)) + + match outcome { + FlowOutcome::Abort => Ok((FlowOutcome::Successful, new_state)), + FlowOutcome::Error(recovery, _err) => { + let (_, state) = recovery(new_state).await?; + Ok((FlowOutcome::Successful, state)) + }, + _ => self.run(new_state).await } - else { - self.run(new_state).await - } } else { Ok((FlowOutcome::Cancelled, state)) diff --git a/gamenight-database/src/error.rs b/gamenight-database/src/error.rs index 82b5c4b..81fe002 100644 --- a/gamenight-database/src/error.rs +++ b/gamenight-database/src/error.rs @@ -1,8 +1,10 @@ +use diesel::result::Error; + #[derive(Debug)] pub struct DatabaseError(pub String); -impl From for DatabaseError { - fn from(value: diesel::result::Error) -> Self { +impl From for DatabaseError { + fn from(value: Error) -> Self { DatabaseError(value.to_string()) } }