1use crate::score::{score_length, score_penalties, score_uniqueness, score_variety};
2
3pub mod score;
4mod tests;
5
6pub fn score(password: &str) -> u16 {
19 let mut score = 0;
20 score += score_length(password);
21 score += score_variety(password);
22 score += score_uniqueness(password);
23 let penalty = score_penalties(password);
24 if penalty == 0 {
25 score = 0;
26 } else {
27 score += penalty;
28 }
29 score
30}
31
32pub fn grade_password(password: &str) -> &str {
44 let score = score(password);
45 if score >= 995 { "A+" }
46 else if score >= 980 { "A" }
47 else if score >= 950 { "A-" }
48 else if score >= 900 { "B+" }
49 else if score >= 850 { "B" }
50 else if score >= 800 { "B-" }
51 else if score >= 750 { "C+" }
52 else if score >= 700 { "C" }
53 else if score >= 650 { "C-" }
54 else if score >= 600 { "D+" }
55 else if score >= 550 { "D" }
56 else if score >= 450 { "D-" }
57 else { "F" }
58}
59
60pub fn review_password(password: &str) -> &str {
71 let length = score_length(password) / 2;
72 let variety = score_variety(password);
73 let uniqueness = score_uniqueness(password);
74 let penalty = score_penalties(password);
75
76 let (min_name, min_value) = if length <= variety && length <= uniqueness && length <= penalty {
77 ("length", length)
78 } else if variety <= length && variety <= uniqueness && variety <= penalty {
79 ("variety", variety)
80 } else if uniqueness <= length && uniqueness <= variety && uniqueness <= penalty {
81 ("uniqueness", uniqueness)
82 } else {
83 ("penalty", penalty)
84 };
85
86 if min_name == "penalty" {
87 if min_value == 0 {
88 "Password is too common. Change it."
89 } else {
90 "Password is similar to a common one. Change it."
91 }
92 } else if min_name == "length" {
93 "Too short. Make it longer."
94 } else if min_name == "variety" {
95 "Add more character types."
96 } else if min_name == "uniqueness" {
97 "Use more unique characters."
98 } else {
99 panic!("You password broke the function! Please report this error!");
100 }
101}
102
103