aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
diff options
context:
space:
mode:
authorMroik <mroik@delayed.space>2026-02-16 05:55:55 +0100
committerMroik <mroik@delayed.space>2026-02-16 05:55:55 +0100
commitf77e41d526a64af26508d590a4a08426290aa7e5 (patch)
treef88fcb13fa61f4b7f07ca2230bdc6b1c3667f885 /src/app.rs
parent3138db2f4e71605c8c6ea8f277b0d97e2afacced (diff)
Add permanent quote file support
Quote file can be placed under `$HOME/.config/marika-finger-blaster/quotes.json`
Diffstat (limited to 'src/app.rs')
-rw-r--r--src/app.rs16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/app.rs b/src/app.rs
index d5edae0..6a0044b 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1,10 +1,10 @@
use std::{
collections::HashSet,
- error::Error,
io::{Stdout, Write, stdout},
time::Duration,
};
+use anyhow::Result;
use crossterm::{
ExecutableCommand, QueueableCommand,
cursor::{MoveDown, MoveTo, MoveToColumn, RestorePosition, SavePosition, SetCursorStyle},
@@ -21,6 +21,7 @@ use tokio::{
};
use crate::{
+ config::Quote,
error::{TerminalTooSmallError, TyperError, WordTooLongError},
input::{Event, handle_input},
state::State,
@@ -49,8 +50,9 @@ pub struct App<'a> {
}
impl App<'_> {
- pub fn new(quote: &str) -> App<'_> {
+ pub fn new(quote: &Quote) -> App<'_> {
let (event_tx, event_rx): (Sender<Event>, Receiver<Event>) = channel(10);
+ let quote = quote.text.as_str();
App {
stdout: stdout(),
quote: quote.split_whitespace().filter(|s| !s.is_empty()).collect(),
@@ -68,7 +70,7 @@ impl App<'_> {
}
}
- async fn run(&mut self) -> Result<(f64, f64, String), Box<dyn Error>> {
+ async fn run(&mut self) -> Result<(f64, f64, String)> {
self.stdout
.execute(EnterAlternateScreen)?
.execute(SetCursorStyle::SteadyBar)?;
@@ -99,7 +101,7 @@ impl App<'_> {
return Ok((wpm, accuracy, history));
}
- pub async fn start(&mut self) -> Result<(), Box<dyn Error>> {
+ pub async fn start(&mut self) -> Result<()> {
let (wpm, accuracy, history) = self.run().await?;
if self.completed {
println!(
@@ -144,7 +146,7 @@ impl App<'_> {
return a.join(" ");
}
- async fn process(&mut self) -> Result<(), Box<dyn Error>> {
+ async fn process(&mut self) -> Result<()> {
let event = self.event_rx.recv().await.unwrap();
match event {
Event::Terminate => self.running = false,
@@ -160,7 +162,7 @@ impl App<'_> {
return Ok(());
}
- async fn handle_keypress(&mut self, k: char) -> Result<(), Box<dyn Error>> {
+ async fn handle_keypress(&mut self, k: char) -> Result<()> {
self.state.buffer.push(k);
let buffer_length = self.state.buffer.chars().count();
let current_word = self.quote[self.state.current];
@@ -195,7 +197,7 @@ impl App<'_> {
}
}
- async fn render(&mut self) -> Result<(), Box<dyn Error>> {
+ async fn render(&mut self) -> Result<()> {
if !self.should_render {
return Ok(());
}
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj