From 4944952ec220d60a5c25906ddac00af9cc1ff927 Mon Sep 17 00:00:00 2001 From: Mroik Date: Tue, 28 Jan 2025 02:46:36 +0100 Subject: Fix broken slicing with UTF-8 characters --- src/app.rs | 59 ++++++++++++++++++++++++++++++++++++++++------------------- src/main.rs | 4 +++- src/state.rs | 10 +--------- 3 files changed, 44 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/app.rs b/src/app.rs index 5de1d10..b447eb7 100644 --- a/src/app.rs +++ b/src/app.rs @@ -116,14 +116,20 @@ impl App { async fn handle_keypress(&mut self, k: char) -> Result<(), Box> { self.state.buffer.push(k); - if self.state.buffer[..self.state.buffer.len() - 1] == self.quote[self.state.current] - && k == ' ' - { + let is_word_completed = self + .state + .buffer + .chars() + .take(self.state.buffer.chars().count() - 1) + .collect::() + == self.quote[self.state.current]; + let is_text_completed = self.state.buffer == self.quote[self.state.current] + && self.state.current == self.quote.len() - 1; + + if is_word_completed && k == ' ' { self.state.buffer.clear(); self.state.current += 1; - } else if self.state.buffer == self.quote[self.state.current] - && self.state.current == self.quote.len() - 1 - { + } else if is_text_completed { self.running = false; self.completed = true; } @@ -156,13 +162,13 @@ impl App { self.stdout.queue(Print(" "))?; } - let mut cur_loc = done.chars().count() + self.state.buffer.len(); - if cur_loc > 0 { + let mut cur_loc = done.chars().count() + self.state.buffer.chars().count(); + if self.state.current > 0 { cur_loc += 1; } for i in 0..self.state.buffer.len() { - if i >= self.quote[self.state.current].len() { + if i >= self.quote[self.state.current].chars().count() { break; } @@ -175,16 +181,31 @@ impl App { self.stdout.queue(Print(&c))?; } - if self.state.buffer.len() < self.quote[self.state.current].len() { - self.stdout.queue(SetForegroundColor(Color::Reset)).unwrap(); - let v = &self.quote[self.state.current][self.state.buffer.len()..]; - self.stdout.queue(Print(&v))?; - } else if self.state.buffer.len() > self.quote[self.state.current].len() { - self.stdout - .queue(SetForegroundColor(Color::Yellow)) - .unwrap(); - let v = &self.state.buffer[self.quote[self.state.current].len()..]; - self.stdout.queue(Print(&v))?; + match ( + self.state.buffer.chars().count(), + self.quote[self.state.current].chars().count(), + ) { + (a, b) if a < b => { + self.stdout.queue(SetForegroundColor(Color::Reset)).unwrap(); + let v = &self.quote[self.state.current] + .chars() + .skip(self.state.buffer.chars().count()) + .collect::(); + self.stdout.queue(Print(&v))?; + } + (a, b) if a > b => { + self.stdout + .queue(SetForegroundColor(Color::Yellow)) + .unwrap(); + let v = &self + .state + .buffer + .chars() + .skip(self.quote[self.state.current].chars().count()) + .collect::(); + self.stdout.queue(Print(&v))?; + } + _ => (), } self.stdout.queue(Print(" "))?; diff --git a/src/main.rs b/src/main.rs index 4c2c734..017344e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![allow(clippy::needless_return)] + mod app; pub mod event; pub mod state; @@ -36,7 +38,7 @@ fn generate_quotes(path: &Path) -> Result, Box> { async fn main() -> Result<(), Box> { let args = Args::parse(); let path = Path::new(&args.quote); - let mut quotes = generate_quotes(&path).unwrap(); + let mut quotes = generate_quotes(path).unwrap(); let mut rng = thread_rng(); let chosen = rng.gen_range(0..quotes.len()); let quote = quotes.remove(chosen); diff --git a/src/state.rs b/src/state.rs index 62fb3c0..f798836 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,13 +1,5 @@ +#[derive(Default)] pub struct State { pub current: usize, pub buffer: String, } - -impl Default for State { - fn default() -> Self { - State { - current: 0, - buffer: String::new(), - } - } -} -- cgit v1.3