diff --git a/gamenight-cli/src/domain/gamenight.rs b/gamenight-cli/src/domain/gamenight.rs new file mode 100644 index 0000000..0763e60 --- /dev/null +++ b/gamenight-cli/src/domain/gamenight.rs @@ -0,0 +1,27 @@ +use std::fmt::Display; + +use chrono::{DateTime, Local}; +use gamenight_api_client_rs::models; + +#[derive(Clone)] +pub struct Gamenight { + pub name: String, + pub start_time: DateTime +} + +impl From for Gamenight { + fn from(value: models::Gamenight) -> Self { + Self { + name: value.name, + start_time: DateTime::parse_from_rfc3339(&value.datetime).unwrap().into() + } + } +} +impl Display for Gamenight { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, r#" +Name: {} +When: {} +"#, self.name, self.start_time.format("%d-%m-%Y %H:%M")) + } +} \ No newline at end of file diff --git a/gamenight-cli/src/domain/mod.rs b/gamenight-cli/src/domain/mod.rs new file mode 100644 index 0000000..08ac6bc --- /dev/null +++ b/gamenight-cli/src/domain/mod.rs @@ -0,0 +1 @@ +pub mod gamenight; \ No newline at end of file diff --git a/gamenight-cli/src/flows/add_gamenight.rs b/gamenight-cli/src/flows/add_gamenight.rs index afde52e..62bec6a 100644 --- a/gamenight-cli/src/flows/add_gamenight.rs +++ b/gamenight-cli/src/flows/add_gamenight.rs @@ -1,6 +1,6 @@ use gamenight_api_client_rs::{apis::default_api::post_gamenight, models}; -use inquire::{Text, DateSelect}; +use inquire::{CustomType, DateSelect, Text}; use chrono::{self, Local, NaiveTime}; use super::*; @@ -21,9 +21,14 @@ 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()) + add_gamenight.name = Some(Text::new("What should we call your gamenight") + .prompt()?); + let naive_date = DateSelect::new("When is your gamenight") + .prompt()?; + let naive_time = CustomType::::new("At What time") + .prompt()?; + add_gamenight.datetime = Some(naive_date + .and_time(naive_time) .and_local_timezone(Local) .earliest() .unwrap() diff --git a/gamenight-cli/src/flows/abort.rs b/gamenight-cli/src/flows/exit.rs similarity index 72% rename from gamenight-cli/src/flows/abort.rs rename to gamenight-cli/src/flows/exit.rs index 6155ed6..572375d 100644 --- a/gamenight-cli/src/flows/abort.rs +++ b/gamenight-cli/src/flows/exit.rs @@ -1,25 +1,25 @@ use super::*; #[derive(Clone)] -pub struct Abort { +pub struct Exit { } -impl Abort { +impl Exit { pub fn new() -> Self { Self{} } } #[async_trait] -impl<'a> Flow<'a> for Abort { +impl<'a> Flow<'a> for Exit { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a> { Ok((FlowOutcome::Abort, state)) } } -impl Display for Abort { +impl Display for Exit { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Abort") + write!(f, "Exit") } } diff --git a/gamenight-cli/src/flows/list_gamenights.rs b/gamenight-cli/src/flows/list_gamenights.rs index 55ac86c..905b2fc 100644 --- a/gamenight-cli/src/flows/list_gamenights.rs +++ b/gamenight-cli/src/flows/list_gamenights.rs @@ -4,7 +4,7 @@ use inquire::Select; use crate::flows::view_gamenight::ViewGamenight; -use super::{abort::Abort, *}; +use super::{exit::Exit, *}; #[derive(Clone)] pub struct ListGamenights { @@ -23,9 +23,9 @@ impl<'a> Flow<'a> for ListGamenights { let response = get_gamenights(&state.configuration).await?; let mut view_flows = response.into_iter().map(|gamenight| -> Box + Send> { - Box::new(ViewGamenight::new(gamenight)) + Box::new(ViewGamenight::new(gamenight.into())) }).collect:: + Send>>>(); - view_flows.push(Box::new(Abort::new())); + view_flows.push(Box::new(Exit::new())); let choice = Select::new("What gamenight would you like to view?", view_flows) .prompt_skippable()?; diff --git a/gamenight-cli/src/flows/main.rs b/gamenight-cli/src/flows/main.rs index 3354aa2..c131118 100644 --- a/gamenight-cli/src/flows/main.rs +++ b/gamenight-cli/src/flows/main.rs @@ -1,5 +1,5 @@ -use super::{abort::Abort, add_gamenight::AddGamenight, list_gamenights::ListGamenights, login::Login, main_menu::MainMenu, *}; +use super::{exit::Exit, add_gamenight::AddGamenight, list_gamenights::ListGamenights, login::Login, main_menu::MainMenu, *}; #[derive(Clone)] pub struct Main { @@ -12,7 +12,7 @@ impl Main { 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())); + main_menu.menu.push(Box::new(Exit::new())); Self { login: Box::new(Login::new()), main_menu: main_menu diff --git a/gamenight-cli/src/flows/mod.rs b/gamenight-cli/src/flows/mod.rs index fd0f657..99a765f 100644 --- a/gamenight-cli/src/flows/mod.rs +++ b/gamenight-cli/src/flows/mod.rs @@ -9,7 +9,7 @@ use dyn_clone::DynClone; pub mod main; mod login; mod main_menu; -mod abort; +mod exit; mod list_gamenights; mod add_gamenight; mod view_gamenight; @@ -68,7 +68,7 @@ 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 + DynClone + Send { +pub trait Flow<'a>: Sync + DynClone + Send + Display { async fn run(&self, state: &'a mut GamenightState) -> FlowResult<'a>; } diff --git a/gamenight-cli/src/flows/view_gamenight.rs b/gamenight-cli/src/flows/view_gamenight.rs index 1803cfd..07241be 100644 --- a/gamenight-cli/src/flows/view_gamenight.rs +++ b/gamenight-cli/src/flows/view_gamenight.rs @@ -1,6 +1,5 @@ -use chrono::DateTime; -use gamenight_api_client_rs::models::Gamenight; +use crate::domain::gamenight::Gamenight; use super::*; @@ -15,21 +14,13 @@ impl ViewGamenight { 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()?); - - + + print!("{}", self.gamenight); Ok((FlowOutcome::Successful, state)) } @@ -37,7 +28,7 @@ impl<'a> Flow<'a> for ViewGamenight { impl Display for ViewGamenight { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{} {}", self.gamenight.name, self.gamenight.datetime) + write!(f, "{} {}", self.gamenight.name, self.gamenight.start_time.format("%d-%m-%Y %H:%M")) } } diff --git a/gamenight-cli/src/main.rs b/gamenight-cli/src/main.rs index 64712bf..7840e81 100644 --- a/gamenight-cli/src/main.rs +++ b/gamenight-cli/src/main.rs @@ -1,4 +1,5 @@ pub mod flows; +pub mod domain; use flows::{main::Main, Flow, GamenightState};