yesorno/
lib.rs

1const YES_STRING: [&str; 6] = ["yes", "true", "y", "proceed", "on", "yup"];
2const NO_STRING: [&str; 6] = ["no", "false", "n", "nope", "off", "halt"];
3
4const YES_MATCH_SCORE_THRESHOLD: f64 = 2.0;
5const NO_MATCH_SCORE_THRESHOLD: f64 = 1.25;
6
7pub fn is_yes(key: &str) -> bool {
8    if YES_STRING.contains(&key) {
9        return true;
10    }
11    return false;
12}
13
14pub fn is_no(key: &str) -> bool {
15    if NO_STRING.contains(&key) {
16        return true;
17    }
18    return false;
19}
20
21fn y_score(key: &str) -> f64 {
22    return match key {
23        "y" => 1.0,
24        "t" => 0.75,
25        "u" => 0.75,
26        "g" => 0.25,
27        "h" => 0.25,
28        "j" => 0.25,
29        _ => 0.0,
30    };
31}
32
33fn e_score(key: &str) -> f64 {
34    return match key {
35        "e" => 1.0,
36        "w" => 0.75,
37        "r" => 0.75,
38        "s" => 0.25,
39        "d" => 0.25,
40        "f" => 0.25,
41        _ => 0.0,
42    };
43}
44
45fn s_score(key: &str) -> f64 {
46    return match key {
47        "s" => 1.0,
48        "w" => 0.25,
49        "r" => 0.75,
50        "q" => 0.25,
51        "e" => 0.25,
52        "a" => 0.75,
53        "d" => 0.75,
54        "z" => 0.25,
55        "x" => 0.25,
56        "c" => 0.25,
57        _ => 0.0,
58    };
59}
60
61fn n_score(key: &str) -> f64 {
62    return match key {
63        "n" => 1.0,
64        "h" => 0.25,
65        "j" => 0.25,
66        "k" => 0.25,
67        "b" => 0.75,
68        "m" => 0.75,
69        _ => 0.0,
70    };
71}
72
73fn o_score(key: &str) -> f64 {
74    return match key {
75        "o" => 1.0,
76        "i" => 0.75,
77        "p" => 0.75,
78        "k" => 0.25,
79        "l" => 0.25,
80        _ => 0.0,
81    };
82}
83
84pub fn is_lenient_yes(key: &str) -> bool {
85    let mut score = 0.0;
86    let first: &str = &key[0..1];
87    score += y_score(&first);
88    if key.len() > 1 {
89        let second: &str = &key[1..2];
90        score += e_score(&second);
91    }
92    if key.len() > 2 {
93        let third: &str = &key[2..3];
94        score += s_score(&third);
95    }
96    return score > YES_MATCH_SCORE_THRESHOLD;
97}
98
99pub fn is_lenient_no(key: &str) -> bool {
100    let mut score = 0.0;
101    let first: &str = &key[0..1];
102    score += n_score(&first);
103    if key.len() > 1 {
104        let second: &str = &key[1..2];
105        score += o_score(&second);
106    }
107    return score > NO_MATCH_SCORE_THRESHOLD;
108}
109
110#[cfg(test)]
111mod tests {
112    use crate::is_lenient_no;
113    use crate::is_lenient_yes;
114    use crate::is_no;
115    use crate::is_yes;
116
117    #[test]
118    fn test_yes_returns_true() {
119        assert_eq!(is_yes("yes"), true);
120        assert_eq!(is_yes("true"), true);
121        assert_eq!(is_yes("y"), true);
122        assert_eq!(is_yes("proceed"), true);
123        assert_eq!(is_yes("on"), true);
124        assert_eq!(is_yes("on"), true);
125    }
126
127    #[test]
128    fn test_yes_returns_false() {
129        assert_eq!(is_yes("e"), false);
130        assert_eq!(is_yes("u"), false);
131        assert_eq!(is_yes("yesh"), false);
132        assert_eq!(is_yes("yp"), false);
133    }
134
135    #[test]
136    fn test_no_returns_true() {
137        assert_eq!(is_no("no"), true);
138        assert_eq!(is_no("nope"), true);
139        assert_eq!(is_no("n"), true);
140        assert_eq!(is_no("false"), true);
141    }
142
143    #[test]
144    fn test_no_returns_false() {
145        assert_eq!(is_no("o"), false);
146        assert_eq!(is_no("u"), false);
147        assert_eq!(is_no("nesh"), false);
148        assert_eq!(is_no("np"), false);
149    }
150
151    #[test]
152    fn test_is_lenient_yes_returns_true() {
153        assert_eq!(is_lenient_yes("yds"), true);
154        assert_eq!(is_lenient_yes("ues"), true);
155        assert_eq!(is_lenient_yes("ywa"), true);
156        assert_eq!(is_lenient_yes("tes"), true);
157        assert_eq!(is_lenient_yes("twa"), true);
158        assert_eq!(is_lenient_yes("urd"), true);
159    }
160
161    #[test]
162    fn test_is_lenient_no_returns_true() {
163        assert_eq!(is_lenient_no("ni"), true);
164        assert_eq!(is_lenient_no("bi"), true);
165        assert_eq!(is_lenient_no("mo"), true);
166    }
167}