aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
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 /src/app.rs
parenta8e4918d8c7b9cfd7dfbd5e2771c3c52cbaaf601 (diff)
Fix broken slicing with UTF-8 characters
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs59
1 files changed, 40 insertions, 19 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(" "))?;
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj