jag

typing_rust

public

A small typing test program in Rust

Star0
Watch0
d29b02a0114e7073424e954f22be89a5b68f41f0
1
ssh://git@git.jaglekon.de:30/jag/typing_rust.git
src/text_combine.rsRust104 lines2.0 KB
1
use rand::prelude::*;
2
3
#[derive(Debug)]
4
pub struct TextCombine {
5
    text: String,
6
    len: usize,
7
    pos: usize,
8
    err_n: usize,
9
    err_s: String,
10
}
11
12
impl TextCombine {
13
    pub fn new() -> Self {
14
        let words: Vec<&str> = include_str!("../assets/wordlist.txt")
15
            .lines()
16
            .collect();
17
18
19
        /*let text = words
20
                    .choose_multiple(&mut rand::rng(), 10)
21
                    .cloned()
22
                    .collect::<Vec<_>>()
23
                    .join(" ");*/
24
        let mut rng = rand::rng();
25
26
        let text = (0..60)
27
            .filter_map(|_| words.choose(&mut rng))
28
            .copied()
29
            .collect::<Vec<&str>>()
30
            .join(" ");
31
32
        let len = text.chars().count();
33
34
        Self {
35
            text,
36
            len,
37
            pos: 0,
38
            err_n: 0,
39
            err_s: String::new(),
40
        }
41
42
    }
43
44
    pub fn get_text(&self) -> &str {
45
        &self.text
46
    }
47
48
    pub fn get_pos(&self) -> usize {
49
        self.pos
50
    }
51
52
    pub fn pos_increment(&mut self) {
53
        if self.pos < self.len {
54
            self.pos += 1;
55
        }
56
    }
57
58
    pub fn err_n_increment(&mut self) {
59
        if self.real_pos() < self.len {
60
            self.err_n += 1;
61
        }
62
    }
63
64
    pub fn get_err_n(&self) -> usize {
65
        self.err_n
66
    }
67
68
    pub fn get_err_s(&self) -> &str {
69
        &self.err_s
70
    }
71
72
    pub fn push_err_s(&mut self, c: char) {
73
        self.err_s.push(c);
74
    }
75
76
    pub fn get_len(&self) -> usize {
77
        self.len
78
    }
79
80
    pub fn curr_char(&self) -> Option<char> {
81
        self.pos_char(self.real_pos())
82
    }
83
84
    pub fn pos_char(&self, pos: usize) -> Option<char> {
85
        self
86
            .text
87
            .chars()
88
            .nth(pos) 
89
    }
90
91
    pub fn real_pos(&self) -> usize {
92
        self.pos + self.err_n
93
    }
94
95
    pub fn back(&mut self) {
96
        if self.err_s.len() > 0 {
97
            self.err_s.pop() ;
98
        } else if self.err_n > 0 {
99
            self.err_n -= 1;
100
        } else if self.pos > 0 {
101
            self.pos -= 1;
102
        }
103
    }
104
}