1 use crate::{MessageChecker, Severity}; |
1 use crate::{MessageChecker, Severity}; |
2 |
2 |
3 struct LetterRepeatChecker {} |
3 use itertools::Itertools; |
|
4 use std::marker::PhantomData; |
4 |
5 |
5 impl<T> MessageChecker<T> for LetterRepeatChecker { |
6 struct LetterRepeatChecker<T> { |
6 fn check(&self, player_id: T, message: &str) -> Severity { |
7 threshold: usize, |
|
8 player_id_type: PhantomData<T>, |
|
9 } |
|
10 |
|
11 impl<T> LetterRepeatChecker<T> { |
|
12 pub fn new(threshold: usize) -> Self { |
|
13 Self { |
|
14 threshold, |
|
15 player_id_type: PhantomData, |
|
16 } |
|
17 } |
|
18 } |
|
19 |
|
20 impl<T> MessageChecker<T> for LetterRepeatChecker<T> { |
|
21 fn check(&self, _player_id: T, message: &str) -> Severity { |
|
22 for (_key, group) in &message.chars().into_iter().group_by(|c| *c) { |
|
23 if group.count() >= self.threshold { |
|
24 return Severity::Warn; |
|
25 } |
|
26 } |
|
27 |
7 Severity::Pass |
28 Severity::Pass |
8 } |
29 } |
9 } |
30 } |
|
31 |
|
32 #[cfg(test)] |
|
33 mod tests { |
|
34 use super::*; |
|
35 #[test] |
|
36 fn it_works() { |
|
37 let checker = LetterRepeatChecker::new(3); |
|
38 assert_eq!(checker.check(0, "Hello world!"), Severity::Pass); |
|
39 assert_eq!(checker.check(0, "ooops"), Severity::Warn); |
|
40 assert_eq!( |
|
41 checker.check(0, "жираф - длинношеее животное"), |
|
42 Severity::Warn |
|
43 ); |
|
44 } |
|
45 } |