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}