jag

typing_rust

public

A small typing test program in Rust

Star0
Watch0
ssh://git@git.jaglekon.de:30/jag/typing_rust.git
src/text_combine.rsRust133 lines2.8 KB
1
use rand::prelude::*;
2
3
#[derive(Debug, PartialEq)]
4
pub enum Mode {
5
    Random,
6
    Excerpt
7
}
8
9
10
#[derive(Debug)]
11
pub struct TextCombine {
12
    mode: Mode,
13
    text: String,
14
    pos: usize,
15
    err_n: usize,
16
    err_s: String,
17
}
18
19
impl TextCombine {
20
    pub fn new(ammount: usize, mode: Mode) -> Self {
21
        
22
        let text = match mode {
23
            Mode::Random => {
24
                let words: Vec<&str> = include_str!("../assets/wordlist.txt")
25
                    .lines()
26
                    .collect();
27
28
29
                let mut rng = rand::rng();
30
31
                (0..ammount)
32
                    .filter_map(|_| words.choose(&mut rng))
33
                    .copied()
34
                    .collect::<Vec<&str>>()
35
                    .join(" ")
36
37
            },
38
            Mode::Excerpt => {
39
40
                let len = ammount * 8;
41
42
                let text: Vec<_> = include_str!("../assets/oddyssey.txt")
43
                    .split("\n\n")
44
                    .map(|s| s.replace('\n', " "))
45
                    .collect();
46
47
                let mut pos = rand::rng().random_range(0..text.len());
48
49
                let mut par = text[pos].clone();
50
51
                while par.len() < len {
52
                    pos = (pos + 1) % text.len();
53
                    par.push_str(&text[pos]);
54
                }
55
56
                if let Some(end) = par[len..].find(' ') {
57
                    par.truncate(len + end);
58
                }
59
                par
60
            },
61
        };
62
 
63
        Self {
64
            mode,
65
            text,
66
            pos: 0,
67
            err_n: 0,
68
            err_s: String::new(),
69
        }
70
71
    }
72
73
    pub fn get_text(&self) -> &str {
74
        &self.text
75
    }
76
77
    pub fn get_pos(&self) -> usize {
78
        self.pos
79
    }
80
81
    pub fn pos_increment(&mut self) {
82
        if self.real_pos() < self.len() - 1 {
83
            self.pos += 1;
84
        }
85
    }
86
87
    pub fn err_n_increment(&mut self) {
88
        if self.real_pos() < self.len() - 1 {
89
            self.err_n += 1;
90
        }
91
    }
92
93
    pub fn get_err_n(&self) -> usize {
94
        self.err_n
95
    }
96
97
    pub fn get_err_s(&self) -> &str {
98
        &self.err_s
99
    }
100
101
    pub fn push_err_s(&mut self, c: char) {
102
        self.err_s.push(c);
103
    }
104
105
    pub fn len(&self) -> usize {
106
        self.text.chars().count()
107
    }
108
109
    pub fn curr_char(&self) -> Option<char> {
110
        self.pos_char(self.real_pos())
111
    }
112
113
    pub fn pos_char(&self, pos: usize) -> Option<char> {
114
        self
115
            .text
116
            .chars()
117
            .nth(pos) 
118
    }
119
120
    pub fn real_pos(&self) -> usize {
121
        self.pos + self.err_n
122
    }
123
124
    pub fn back(&mut self) {
125
        if !self.err_s.is_empty() {
126
            self.err_s.pop() ;
127
        } else if self.err_n > 0 {
128
            self.err_n -= 1;
129
        } else if self.pos > 0 {
130
            self.pos -= 1;
131
        }
132
    }
133
}