use std::str::FromStr;
use time::Date;
use crate::uslm::parser::ParseError;
type Result<T> = std::result::Result<T, ParseError>;
fn month_from_number(n: i32) -> Result<time::Month> {
match n {
1 => Ok(time::Month::January),
2 => Ok(time::Month::February),
3 => Ok(time::Month::March),
4 => Ok(time::Month::April),
5 => Ok(time::Month::May),
6 => Ok(time::Month::June),
7 => Ok(time::Month::July),
8 => Ok(time::Month::August),
9 => Ok(time::Month::September),
10 => Ok(time::Month::October),
11 => Ok(time::Month::November),
12 => Ok(time::Month::December),
_ => Err(ParseError::InvalidDate),
}
}
pub fn date_str_to_date(date_str: &str) -> Result<Date> {
let date_split: Vec<&str> = date_str.split("-").collect();
if date_split.len() != 3 {
return Err(ParseError::InvalidDate);
}
let year_num = i32::from_str(date_split[0]).map_err(|_| ParseError::InvalidDate)?;
let month_num = i32::from_str(date_split[1]).map_err(|_| ParseError::InvalidDate)?;
let day_num = u8::from_str(date_split[2]).map_err(|_| ParseError::InvalidDate)?;
let month_enum = month_from_number(month_num)?;
Date::from_calendar_date(year_num, month_enum, day_num).map_err(|_| ParseError::InvalidDate)
}