diff --git a/backend-actix/Cargo.lock b/backend-actix/Cargo.lock index a8963ff..8cd8b1c 100644 --- a/backend-actix/Cargo.lock +++ b/backend-actix/Cargo.lock @@ -444,9 +444,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.19" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "jobserver", "libc", @@ -461,9 +461,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -592,9 +592,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.9" +version = "2.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d3950690ba3a6910126162b47e775e203006d4242a15de912bec6c0a695153" +checksum = "ff3e1edb1f37b4953dd5176916347289ed43d7119cc2e6c7c3f7849ff44ea506" dependencies = [ "bitflags", "byteorder", @@ -620,9 +620,9 @@ dependencies = [ [[package]] name = "diesel_derives" -version = "2.2.4" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55" +checksum = "68d4216021b3ea446fd2047f5c8f8fe6e98af34508a254a01e4d6bc1e844f84d" dependencies = [ "diesel_table_macro_syntax", "dsl_auto_type", @@ -855,9 +855,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "heck" @@ -1093,9 +1093,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" +checksum = "27e77966151130221b079bcec80f1f34a9e414fa489d99152a201c07fd2182bc" dependencies = [ "jiff-static", "log", @@ -1106,9 +1106,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" +checksum = "97265751f8a9a4228476f2fc17874a9e7e70e96b893368e42619880fe143b48a" dependencies = [ "proc-macro2", "quote", @@ -1757,9 +1757,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -1768,9 +1768,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -1870,9 +1870,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -1882,26 +1882,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tracing" version = "0.1.41" @@ -2268,9 +2275,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.6" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" dependencies = [ "memchr", ] @@ -2322,18 +2329,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", diff --git a/gamenight-cli/Cargo.lock b/gamenight-cli/Cargo.lock index e21ec08..12b885e 100644 --- a/gamenight-cli/Cargo.lock +++ b/gamenight-cli/Cargo.lock @@ -17,6 +17,21 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "async-trait" version = "0.1.88" @@ -93,9 +108,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.19" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "shlex", ] @@ -106,6 +121,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -298,6 +327,8 @@ name = "gamenight-cli" version = "0.1.0" dependencies = [ "async-trait", + "chrono", + "dyn-clone", "gamenight-api-client-rs", "inquire", "tokio", @@ -353,9 +384,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "http" @@ -470,6 +501,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -626,6 +681,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ "bitflags 2.9.0", + "chrono", "crossterm", "dyn-clone", "fuzzy-matcher", @@ -772,6 +828,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -821,9 +886,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -978,9 +1043,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.0", "errno", @@ -1208,9 +1273,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -1228,9 +1293,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -1591,6 +1656,41 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.1.1" @@ -1604,7 +1704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", + "windows-strings 0.3.1", "windows-targets 0.53.0", ] @@ -1626,6 +1726,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/gamenight-cli/Cargo.toml b/gamenight-cli/Cargo.toml index 9df718f..3da2444 100644 --- a/gamenight-cli/Cargo.toml +++ b/gamenight-cli/Cargo.toml @@ -6,5 +6,7 @@ edition = "2024" [dependencies] gamenight-api-client-rs = { path = "../gamenight-api-client-rs" } tokio = { version = "1", features = ["full"] } -inquire = "0.7.5" -async-trait = "0.1" \ No newline at end of file +inquire = { version = "0.7.5", features = ["date"] } +async-trait = "0.1" +dyn-clone = "1.0" +chrono = "0.4" \ No newline at end of file diff --git a/gamenight-cli/src/flows/abort.rs b/gamenight-cli/src/flows/abort.rs index bb55a69..6155ed6 100644 --- a/gamenight-cli/src/flows/abort.rs +++ b/gamenight-cli/src/flows/abort.rs @@ -1,5 +1,6 @@ use super::*; +#[derive(Clone)] pub struct Abort { } diff --git a/gamenight-cli/src/flows/add_gamenight.rs b/gamenight-cli/src/flows/add_gamenight.rs new file mode 100644 index 0000000..afde52e --- /dev/null +++ b/gamenight-cli/src/flows/add_gamenight.rs @@ -0,0 +1,44 @@ + +use gamenight_api_client_rs::{apis::default_api::post_gamenight, models}; +use inquire::{Text, DateSelect}; +use chrono::{self, Local, NaiveTime}; + +use super::*; + +#[derive(Clone)] +pub struct AddGamenight { + +} + +impl AddGamenight { + pub fn new() -> Self { + Self {} + } +} + +#[async_trait] +impl<'a> Flow<'a> for AddGamenight { + async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { + let mut add_gamenight = models::AddGamenightRequestBody::new(); + + add_gamenight.name = Some(Text::new("What should we call your gamenight").prompt()?); + add_gamenight.datetime = Some(DateSelect::new("When is your gamenight").prompt()? + .and_time(NaiveTime::default()) + .and_local_timezone(Local) + .earliest() + .unwrap() + .to_utc() + .to_rfc3339()); + + post_gamenight(&state.configuration, Some(add_gamenight)).await?; + + Ok((FlowOutcome::Successful, state)) + } +} + +impl Display for AddGamenight { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Add Gamenight.") + } +} + diff --git a/gamenight-cli/src/flows/list_gamenights.rs b/gamenight-cli/src/flows/list_gamenights.rs index 10c0680..55ac86c 100644 --- a/gamenight-cli/src/flows/list_gamenights.rs +++ b/gamenight-cli/src/flows/list_gamenights.rs @@ -1,8 +1,12 @@ use gamenight_api_client_rs::apis::default_api::get_gamenights; +use inquire::Select; -use super::*; +use crate::flows::view_gamenight::ViewGamenight; +use super::{abort::Abort, *}; + +#[derive(Clone)] pub struct ListGamenights { } @@ -17,8 +21,16 @@ impl ListGamenights { impl<'a> Flow<'a> for ListGamenights { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { let response = get_gamenights(&state.configuration).await?; - println!("{:?}", response); - Ok((FlowOutcome::Successful, state)) + + let mut view_flows = response.into_iter().map(|gamenight| -> Box + Send> { + Box::new(ViewGamenight::new(gamenight)) + }).collect:: + Send>>>(); + view_flows.push(Box::new(Abort::new())); + + let choice = Select::new("What gamenight would you like to view?", view_flows) + .prompt_skippable()?; + + handle_choice_option(&choice, self, state).await } } diff --git a/gamenight-cli/src/flows/login.rs b/gamenight-cli/src/flows/login.rs index daec6e2..cdf47bd 100644 --- a/gamenight-cli/src/flows/login.rs +++ b/gamenight-cli/src/flows/login.rs @@ -4,6 +4,7 @@ use inquire::{Password, Text}; use super::*; +#[derive(Clone)] pub struct Login { } diff --git a/gamenight-cli/src/flows/main.rs b/gamenight-cli/src/flows/main.rs index e3951cb..3354aa2 100644 --- a/gamenight-cli/src/flows/main.rs +++ b/gamenight-cli/src/flows/main.rs @@ -1,7 +1,7 @@ -use super::{abort::Abort, list_gamenights::ListGamenights, login::Login, main_menu::MainMenu, *}; - +use super::{abort::Abort, add_gamenight::AddGamenight, list_gamenights::ListGamenights, login::Login, main_menu::MainMenu, *}; +#[derive(Clone)] pub struct Main { login: Box Flow<'a>>, main_menu: MainMenu @@ -11,6 +11,7 @@ impl Main { pub fn new() -> Self { let mut main_menu = MainMenu::new(); main_menu.menu.push(Box::new(ListGamenights::new())); + main_menu.menu.push(Box::new(AddGamenight::new())); main_menu.menu.push(Box::new(Abort::new())); Self { login: Box::new(Login::new()), diff --git a/gamenight-cli/src/flows/main_menu.rs b/gamenight-cli/src/flows/main_menu.rs index 745bc47..0a8a30b 100644 --- a/gamenight-cli/src/flows/main_menu.rs +++ b/gamenight-cli/src/flows/main_menu.rs @@ -3,6 +3,7 @@ use inquire::{ui::RenderConfig, Select}; use super::*; +#[derive(Clone)] pub struct MainMenu { pub menu: Vec Flow<'a> + Send>> } @@ -22,7 +23,7 @@ unsafe impl Send for MainMenu { #[async_trait] impl<'a> Flow<'a> for MainMenu { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { - let choice = Select::new("What would you like to do?", self.menu) + let choice = Select::new("What would you like to do?", self.menu.clone()) .with_help_message("Select the action you want to take or quit the program") .with_render_config(RenderConfig { option_index_prefix: inquire::ui::IndexPrefix::Simple, @@ -30,19 +31,7 @@ impl<'a> Flow<'a> for MainMenu { }) .prompt_skippable()?; - if let Some(choice) = choice { - let (outcome, new_state) = choice.run(state).await?; - - if outcome == FlowOutcome::Abort { - Ok((outcome, new_state)) - } - else { - self.run(new_state).await - } - } - else { - return Ok((FlowOutcome::Abort, state)) - } + handle_choice_option(&choice, self, state).await } } diff --git a/gamenight-cli/src/flows/mod.rs b/gamenight-cli/src/flows/mod.rs index 0900d0f..fd0f657 100644 --- a/gamenight-cli/src/flows/mod.rs +++ b/gamenight-cli/src/flows/mod.rs @@ -1,14 +1,18 @@ use std::fmt::Display; use async_trait::async_trait; +use chrono::ParseError; use gamenight_api_client_rs::apis::configuration::Configuration; use inquire::InquireError; +use dyn_clone::DynClone; pub mod main; -pub mod login; +mod login; mod main_menu; mod abort; mod list_gamenights; +mod add_gamenight; +mod view_gamenight; pub struct GamenightState { configuration: Configuration, @@ -43,6 +47,14 @@ impl From> for FlowError { } } +impl From for FlowError { + fn from(value: ParseError) -> Self { + Self { + error: value.to_string() + } + } +} + #[derive(PartialEq)] pub enum FlowOutcome { Successful, @@ -53,7 +65,29 @@ pub enum FlowOutcome { type FlowResult<'a> = Result<(FlowOutcome, &'a mut GamenightState), FlowError>; +dyn_clone::clone_trait_object!(for<'a> Flow<'a>); + #[async_trait] -pub trait Flow<'a>: Sync + Display { +pub trait Flow<'a>: Sync + Display + DynClone + Send { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a>; +} + +async fn handle_choice<'a>(choice: &Box + Send>, flow: &dyn Flow<'a>, state: &'a mut GamenightState) -> FlowResult<'a> { + let (outcome, new_state) = choice.run(state).await?; + + if outcome == FlowOutcome::Abort { + Ok((FlowOutcome::Successful, new_state)) + } + else { + flow.run(new_state).await + } +} + +async fn handle_choice_option<'a>(choice: &Option + Send>>, flow: &dyn Flow<'a>, state: &'a mut GamenightState) -> FlowResult<'a> { + if let Some(choice) = choice { + handle_choice(&choice, flow, state).await + } + else { + Ok((FlowOutcome::Abort, state)) + } } \ No newline at end of file diff --git a/gamenight-cli/src/flows/view_gamenight.rs b/gamenight-cli/src/flows/view_gamenight.rs new file mode 100644 index 0000000..1803cfd --- /dev/null +++ b/gamenight-cli/src/flows/view_gamenight.rs @@ -0,0 +1,43 @@ + +use chrono::DateTime; +use gamenight_api_client_rs::models::Gamenight; + +use super::*; + +#[derive(Clone)] +pub struct ViewGamenight { + gamenight: Gamenight +} + +impl ViewGamenight { + pub fn new(gamenight: Gamenight) -> Self { + Self { + gamenight + } + } + + pub fn gamenight_localtime(&self) -> Result { + let datetime = DateTime::parse_from_rfc3339(&self.gamenight.datetime)?; + let offset = *chrono::offset::Local::now().offset(); + Ok(format!("{}", datetime.naive_local().checked_add_offset(offset).unwrap().format("%d-%m-%Y %H:%M"))) + } +} + +#[async_trait] +impl<'a> Flow<'a> for ViewGamenight { + async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { + println!("Name: {}", self.gamenight.name); + println!("When: {}", self.gamenight_localtime()?); + + + + Ok((FlowOutcome::Successful, state)) + } +} + +impl Display for ViewGamenight { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{} {}", self.gamenight.name, self.gamenight.datetime) + } +} +