Skip to main content

passcore/
lib.rs

1use crate::score::{score_length, score_penalties, score_uniqueness, score_variety};
2
3pub mod score;
4mod tests;
5
6/// The score function takes a password as input and outputs a score.<br>
7/// It makes use of 4 scoring functions located in the score.rs file.<br>
8/// The score function will never log your password <br>
9///
10/// # Example
11/// ``` rust
12/// use passcore::score;
13///
14/// let password = "password";
15/// let psw_score = score(password);
16/// println!("Your password's score is {}", psw_score)
17/// ```
18pub 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
32/// The grade_password function takes a password as input and outputs a letter grade.<br>
33/// The grade_password function will never log your password <br>
34///
35/// # Example
36/// ``` rust
37/// use passcore::{grade_password, score};
38///
39/// let password = "password";
40/// let grade = grade_password(password);
41/// println!("Your password's grade is {}", grade)
42/// ```
43pub 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
60/// The review_password function takes a password as input and outputs suggestions for improvement.<br>
61/// The review_password function will never log your password <br>
62///
63/// # Example
64/// ``` rust
65/// use passcore::review_password;
66///
67/// let password = "password";
68/// print!("{}", review_password(password))
69/// ```
70pub 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// Test modules moved to src/tests.rs