jag

typing_rust

public

A small typing test program in Rust

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