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}