rust/chat_sanitizer/src/letter_repeat.rs
changeset 14505 ba29aa03db87
parent 14503 831ecafd74c6
equal deleted inserted replaced
14504:6cc0fce249f9 14505:ba29aa03db87
     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 }