verlib/
utils.rs

1#[derive(PartialEq, Eq)]
2pub enum NumChecker {
3    Start,
4    NotNum,
5    Zero,
6    OtherNum,
7}
8
9impl NumChecker {
10    pub fn new() -> NumChecker {
11        NumChecker::Start
12    }
13
14    pub fn reset(&mut self) {
15        *self = NumChecker::Start;
16    }
17
18    pub fn numeric(&self) -> bool {
19        match *self {
20            NumChecker::Start => false,
21            NumChecker::NotNum => false,
22            NumChecker::Zero => true,
23            NumChecker::OtherNum => true,
24        }
25    }
26
27    pub fn check(&mut self, c: u8) -> bool {
28        *self = match *self {
29            NumChecker::Start|NumChecker::NotNum => {
30                if c == b'0' {
31                    NumChecker::Zero
32                } else if b'0' <= c && c <= b'9' {
33                    NumChecker::OtherNum
34                } else {
35                    NumChecker::NotNum
36                }
37            }
38            NumChecker::Zero => {
39                if b'0' <= c && c <= b'9' {
40                    return false;
41                } else {
42                    NumChecker::NotNum
43                }
44            }
45            NumChecker::OtherNum => {
46                if b'0' <= c && c <= b'9' {
47                    NumChecker::OtherNum
48                } else {
49                    NumChecker::NotNum
50                }
51            }
52        };
53        true
54    }
55}
56
57#[cfg(test)]
58mod tests {
59    use super::NumChecker;
60
61    fn all_checks(s: &[u8]) -> bool {
62        let mut num_check = NumChecker::new();
63        for &c in s {
64            if !num_check.check(c) {
65                return false;
66            }
67        }
68        true
69    }
70
71    #[test]
72    fn test_num_checker() {
73        assert!(all_checks(b"test123yes456"));
74        assert!(!all_checks(b"test0123yes456"));
75        assert!(!all_checks(b"test123yes0456"));
76    }
77}