use std::time::{SystemTime, UNIX_EPOCH};
#[inline]
pub(crate) fn current_timestamp() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_secs()
}
#[inline]
pub(crate) fn is_valid_email(email: &str) -> bool {
let email = email.trim();
let parts: Vec<&str> = email.split('@').collect();
if parts.len() != 2 {
return false;
}
let local = parts[0];
let domain = parts[1];
if local.is_empty() {
return false;
}
if !domain.contains('.') {
return false;
}
if domain.starts_with('.') || domain.ends_with('.') {
return false;
}
if let Some(tld) = domain.rsplit('.').next() {
if tld.is_empty() {
return false;
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_emails() {
assert!(is_valid_email("user@example.com"));
assert!(is_valid_email("user.name@example.com"));
assert!(is_valid_email("user@sub.example.com"));
assert!(is_valid_email("user+tag@example.com"));
}
#[test]
fn test_invalid_emails() {
assert!(!is_valid_email(""));
assert!(!is_valid_email("user"));
assert!(!is_valid_email("@example.com"));
assert!(!is_valid_email("user@"));
assert!(!is_valid_email("user@example"));
assert!(!is_valid_email("user@@example.com"));
assert!(!is_valid_email("user@.example.com"));
assert!(!is_valid_email("user@example."));
}
}