diff --git a/flake.lock b/flake.lock index 4aae639..e9e2889 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1724748588, - "narHash": "sha256-NlpGA4+AIf1dKNq76ps90rxowlFXUsV9x7vK/mN37JM=", + "lastModified": 1725534445, + "narHash": "sha256-Yd0FK9SkWy+ZPuNqUgmVPXokxDgMJoGuNpMEtkfcf84=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a6292e34000dc93d43bccf78338770c1c5ec8a99", + "rev": "9bb1e7571aadf31ddb4af77fc64b2d59580f9a39", "type": "github" }, "original": { @@ -62,11 +62,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1724811750, - "narHash": "sha256-PvhVgQ1rm3gfhK7ts4emprhh/KMkFwXogmgsQ3srR7g=", + "lastModified": 1725589472, + "narHash": "sha256-+OB00N6Yql/ZRQQkQ0PNnxfW2tH89DHnv29hBS7tXMM=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "6a1c4915dca7149e7258d8c7f3ac634d8c65f6c6", + "rev": "2b00881d2ff72174cffdc007238cb6bedd6e1d8e", "type": "github" }, "original": { diff --git a/frontend/src/pages/game.rs b/frontend/src/pages/game.rs index 92fc030..c79d288 100644 --- a/frontend/src/pages/game.rs +++ b/frontend/src/pages/game.rs @@ -1,124 +1,122 @@ -// use rand::seq::SliceRandom; -use serde::{Deserialize, Serialize}; - -use crate::CharStatus; - -const MAX_TRIES: usize = 5; - -// #[derive(Debug, Serialize, Deserialize, Clone)] -// struct Games(Vec); - -// impl Games { -// pub const fn new() -> Self { -// Self(Vec::new()) -// } - -// pub fn new_game(&mut self, word: String) { -// let game = Game::new(); -// self.0.push(game); -// } - -// pub fn current_game(&self) -> Option<&Game> { -// self.0.last() -// } -// } - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] -pub struct WordList { - words: Vec, -} - -impl WordList { - pub const fn new() -> Self { - Self { words: Vec::new() } - } - pub fn from_json(s: &str) -> Self { - serde_json::from_str(s).map_or(Self::new(), |w| w) - } - // pub fn to_json(&self) -> String { - // serde_json::to_string_pretty(self).map_or(String::new(), |w| w) - // } - // pub fn get_word(&self) -> String { - // let mut rng = rand::thread_rng(); - // self.words - // .choose(&mut rng) - // .map_or_else(String::new, |w| (*w).to_string()) - // } -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct Game { - pub word: Option, - pub submitted_words: Vec>>, - tries: usize, - status: Status, -} - -impl Game { - pub const fn new() -> Self { - Self { - word: None, - tries: 0, - submitted_words: Vec::new(), - status: Status::New, - } - } - - pub fn start(&mut self, word: String) { - if self.word.is_none() && self.status == Status::New { - self.status = Status::InProgress; - self.word = Some(word); - } - } - - pub fn submit_answer(&mut self, answer: &[String]) { - if let Some(ref word) = self.word { - let res = crate::compare_strings(word, &answer.join("")); - self.submitted_words.push(res); - self.tries += 1; - self.status = self.current_status(); - } - } - - pub fn current_status(&self) -> Status { - self.word.as_ref().map_or(Status::New, |_| { - let word_count = self.submitted_words.len(); - if self.tries == 0 { - Status::New - } else if self.tries < MAX_TRIES { - if self - .submitted_words - .last() - .unwrap() - .iter() - .all(|v| matches!(v, CharStatus::Match(_))) - { - Status::Win(word_count) - } else { - Status::InProgress - } - } else if self - .submitted_words - .last() - .unwrap() - .iter() - .all(|v| matches!(v, CharStatus::Match(_))) - { - Status::Win(word_count) - } else { - Status::Lose(word_count) - } - }) - } -} - -type Tries = usize; - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] -#[allow(clippy::module_name_repetitions)] -pub enum Status { - New, - Win(Tries), - Lose(Tries), - InProgress, -} +// use rand::seq::SliceRandom; +use serde::{Deserialize, Serialize}; + +use crate::CharStatus; + +const MAX_TRIES: usize = 5; + +// #[derive(Debug, Serialize, Deserialize, Clone)] +// struct Games(Vec); + +// impl Games { +// pub const fn new() -> Self { +// Self(Vec::new()) +// } + +// pub fn new_game(&mut self, word: String) { +// let game = Game::new(); +// self.0.push(game); +// } + +// pub fn current_game(&self) -> Option<&Game> { +// self.0.last() +// } +// } + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +pub struct WordList { + words: Vec, +} + +impl WordList { + pub const fn new() -> Self { + Self { words: Vec::new() } + } + pub fn from_json(s: &str) -> Self { + serde_json::from_str(s).map_or(Self::new(), |w| w) + } + // pub fn to_json(&self) -> String { + // serde_json::to_string_pretty(self).map_or(String::new(), |w| w) + // } + // pub fn get_word(&self) -> String { + // let mut rng = rand::thread_rng(); + // self.words + // .choose(&mut rng) + // .map_or_else(String::new, |w| (*w).to_string()) + // } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Game { + pub word: Option, + pub submitted_words: Vec>>, + tries: usize, + status: Status, +} + +impl Game { + pub const fn new() -> Self { + Self { + word: None, + tries: 0, + submitted_words: Vec::new(), + status: Status::New, + } + } + + pub fn start(&mut self, word: String) { + if self.word.is_none() && self.status == Status::New { + self.status = Status::InProgress; + self.word = Some(word); + } + } + + pub fn submit_answer(&mut self, answer: &[String]) { + if let Some(ref word) = self.word { + let res = crate::compare_strings(word, &answer.join("")); + self.submitted_words.push(res); + self.tries += 1; + self.status = self.current_status(); + } + } + + pub fn current_status(&self) -> Status { + self.word.as_ref().map_or(Status::New, |_| { + let word_count = self.submitted_words.len(); + match self.tries { + 0 => Status::New, + 1..MAX_TRIES => self + .submitted_words + .last() + .map_or(Status::InProgress, |words| { + if words.iter().all(|v| matches!(v, CharStatus::Match(_))) { + Status::Win(word_count) + } else { + Status::InProgress + } + }), + _ => self + .submitted_words + .last() + .map_or(Status::Lose(word_count), |words| { + if words.iter().all(|v| matches!(v, CharStatus::Match(_))) { + Status::Win(word_count) + } else { + Status::Lose(word_count) + } + }), + } + }) + } +} + +type Tries = usize; + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +#[allow(clippy::module_name_repetitions)] +pub enum Status { + New, + Win(Tries), + Lose(Tries), + InProgress, +}