aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMroik <mroik@delayed.space>2025-01-28 02:46:36 +0100
committerMroik <mroik@delayed.space>2025-02-01 19:33:04 +0100
commit4944952ec220d60a5c25906ddac00af9cc1ff927 (patch)
treec8cb1c5a795799b888b4a4179c37dc8cda4541e7
parenta8e4918d8c7b9cfd7dfbd5e2771c3c52cbaaf601 (diff)
Fix broken slicing with UTF-8 characters
-rw-r--r--src/app.rs59
-rw-r--r--src/main.rs4
-rw-r--r--src/state.rs10
3 files changed, 44 insertions, 29 deletions
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<dyn Error>> {
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::<String>()
+ == 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::<String>();
+ 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::<String>();
+ 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<Vec<String>, Box<dyn Error>> {
async fn main() -> Result<(), Box<dyn Error>> {
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(),
- }
- }
-}
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj