use crate::helpers::regex::{CaseSensitivity, RegexType};
pub struct Tester;
impl Tester {
pub fn validate(val: &str, rt: RegexType) -> Box<Result<bool, fancy_regex::Error>> {
let (regex_pattern, case_sensitivity) = Tester::acquire_regex(rt);
let regex_pattern = match case_sensitivity {
CaseSensitivity::CaseInsensitive => format!("(?i){regex_pattern}"),
_ => regex_pattern.to_string(),
};
let regex = match fancy_regex::Regex::new(®ex_pattern) {
Ok(regex) => regex,
Err(err) => return Box::new(Err(err)),
};
Box::new(regex.is_match(val))
}
pub fn validate_username(val: &str) -> Box<Result<bool, fancy_regex::Error>> {
Self::validate(
val,
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
)
}
fn acquire_regex(rt: RegexType) -> (&'static str, CaseSensitivity) {
match rt {
RegexType::Alphabetic(cs) => (r"^[a-z]{1,38}$", cs), RegexType::AlphaNumeric(cs) => (r"^[a-z][a-z0-9]{0,37}$", cs), RegexType::AlphaNumericLoose(cs) => (r"^[a-z0-9]{1,38}$", cs), RegexType::AlphaNumericSpace(cs) => (r"^[a-z](?!.*\s\s)(?!.*\s$)[a-z0-9\s]{0,37}$", cs), RegexType::AlphaNumericDash(cs) => (r"^[a-z](?!.*\-\-)(?!.*\-$)[a-z\d\-]{0,37}$", cs), RegexType::AlphaNumericDot(cs) => (r"^[a-z](?!.*\.\.)(?!.*\.$)[a-z\d\.]{0,37}$", cs), RegexType::AlphaNumericUnderscore(cs) => {
(r"^[a-z](?!.*\_\_)(?!.*\_$)[a-z\d\_]{0,37}$", cs)
} RegexType::AlphaNumericDotUnderscore(cs) => {
(r"^[a-z](?!.*\.\.)(?!.*\.$)[a-z\d\._]{0,37}$", cs)
} RegexType::AlphaNumericDashDot(cs) => (
r"^[a-z](?!.*\-\-)(?!.*\.\.)(?!.*\-$)(?!.*\.$)[a-z\d\-\.\_]{0,37}$",
cs,
), RegexType::Digits => (r"^[0-9]+$", CaseSensitivity::CaseSensitive),
RegexType::Email => (
r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$",
CaseSensitivity::CaseInsensitive,
),
RegexType::Custom(val, cs, _size) => {
(val, cs.unwrap_or(CaseSensitivity::CaseSensitive))
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_alphabetic_valid() {
let result = Tester::validate(
"username",
RegexType::Alphabetic(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"USERNAME",
RegexType::Alphabetic(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alphabetic_case_insensitive_valid() {
let result = Tester::validate(
"UserName",
RegexType::Alphabetic(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alphabetic_invalid() {
let result = Tester::validate(
"user1name",
RegexType::Alphabetic(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"1username",
RegexType::Alphabetic(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"username1",
RegexType::Alphabetic(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_valid() {
let result = Tester::validate(
"username",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user1name",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user1name2",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_case_insensitive_valid() {
let result = Tester::validate(
"User1Name",
RegexType::AlphaNumeric(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_invalid() {
let result = Tester::validate(
"user123!",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user123_",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"123user",
RegexType::AlphaNumeric(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_loose_valid() {
let result = Tester::validate(
"123username",
RegexType::AlphaNumericLoose(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user1name",
RegexType::AlphaNumericLoose(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_email_valid() {
let result = Tester::validate("user@example.com", RegexType::Email);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate("user.name@example.co.uk", RegexType::Email);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_email_invalid() {
let result = Tester::validate("userexample.com", RegexType::Email);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate("user@example", RegexType::Email);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alphanumeric_space_valid() {
let result = Tester::validate(
"user name",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user123 name",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user name 123",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alphanumeric_space_case_insensitive_valid() {
let result = Tester::validate(
"User Name 123",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alphanumeric_space_invalid() {
let result = Tester::validate(
"user name",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user name ",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
" username",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"1username",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user@name",
RegexType::AlphaNumericSpace(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_valid() {
let result = Tester::validate(
"username-123",
RegexType::AlphaNumericDash(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user-123",
RegexType::AlphaNumericDash(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_case_insensitive_valid() {
let result = Tester::validate(
"UserName-123",
RegexType::AlphaNumericDash(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_invalid() {
let result = Tester::validate(
"user--123",
RegexType::AlphaNumericDash(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user-",
RegexType::AlphaNumericDash(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"-user123",
RegexType::AlphaNumericDash(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_valid() {
let result = Tester::validate(
"user.name",
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user123.name",
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_case_insensitive_valid() {
let result = Tester::validate(
"User.Name",
RegexType::AlphaNumericDot(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_invalid() {
let result = Tester::validate(
"user..name",
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user.name.",
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
".username",
RegexType::AlphaNumericDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_dot_valid() {
let result = Tester::validate(
"user-name.123",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user-name_123",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_dot_case_insensitive_valid() {
let result = Tester::validate(
"User-Name.123",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dash_dot_invalid() {
let result = Tester::validate(
"user..name",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user-name.",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user-.name",
RegexType::AlphaNumericDashDot(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_underscore_valid() {
let result = Tester::validate(
"user_name",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
let result = Tester::validate(
"user123_name",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_underscore_case_insensitive_valid() {
let result = Tester::validate(
"User_Name",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_underscore_invalid() {
let result = Tester::validate(
"user__name",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user_name_",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"_username",
RegexType::AlphaNumericUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_underscore_valid() {
let result = Tester::validate(
"user.name_123",
RegexType::AlphaNumericDotUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_underscore_case_insensitive_valid() {
let result = Tester::validate(
"User.Name_123",
RegexType::AlphaNumericDotUnderscore(CaseSensitivity::CaseInsensitive),
);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_alpha_numeric_dot_underscore_invalid() {
let result = Tester::validate(
"user..name_123",
RegexType::AlphaNumericDotUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"user_name_.",
RegexType::AlphaNumericDotUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
let result = Tester::validate(
"_user.name",
RegexType::AlphaNumericDotUnderscore(CaseSensitivity::CaseSensitive),
);
assert!(result.is_ok() && !result.unwrap());
}
#[test]
fn test_digits_valid() {
let result = Tester::validate("123456", RegexType::Digits);
assert!(result.is_ok() && result.unwrap());
}
#[test]
fn test_digits_invalid() {
let result = Tester::validate("123a456", RegexType::Digits);
assert!(result.is_ok() && !result.unwrap());
}
}