pub fn is_valid_time_format(time_str: &str) -> bool {
if !(8..=12).contains(&time_str.len()) {
return false;
}
let parts: Vec<&str> = time_str.split(':').collect();
if parts.len() < 3 || parts.len() > 4 {
return false;
}
let hours = parts[0].parse::<u32>().ok();
let minutes = parts[1].parse::<u32>().ok();
let seconds_parts: Vec<&str> = parts[2].split('.').collect();
let seconds = seconds_parts[0].parse::<u32>().ok();
let milliseconds = if seconds_parts.len() == 2 {
seconds_parts[1].parse::<u32>().ok()
} else {
Some(0)
};
hours.is_some()
&& minutes.is_some()
&& seconds.is_some()
&& milliseconds.is_some()
&& hours.unwrap() < 24
&& minutes.unwrap() < 60
&& seconds.unwrap() < 60
&& milliseconds.unwrap() < 1000
}
pub fn is_valid_date_format(date_str: &str) -> bool {
if date_str.len() != 10 {
return false;
}
let parts: Vec<&str> = date_str.split('-').collect();
if parts.len() != 3 {
return false;
}
let year = parts[0].parse::<u32>().ok();
let month = parts[1].parse::<u32>().ok();
let day = parts[2].parse::<u32>().ok();
year.is_some()
&& month.is_some()
&& day.is_some()
&& year.unwrap() >= 1
&& month.unwrap() >= 1
&& month.unwrap() <= 12
&& day.unwrap() >= 1
&& day.unwrap() <= 31
}
pub fn is_valid_datetime_format(datetime_str: &str) -> bool {
if !(19..=23).contains(&datetime_str.len()) {
return false;
}
let parts: Vec<&str> = datetime_str.split_whitespace().collect();
if parts.len() != 2 {
return false;
}
is_valid_date_format(parts[0]) && is_valid_time_format(parts[1])
}