diff --git a/src/parse_relative_time.rs b/src/parse_relative_time.rs index 1c193bf..ea4a190 100644 --- a/src/parse_relative_time.rs +++ b/src/parse_relative_time.rs @@ -59,7 +59,7 @@ pub fn parse_relative_time_at_date( return Ok(datetime); } let time_pattern: Regex = Regex::new( - r"(?x) + r"(?ix) (?:(?P[-+]?\s*\d*)\s*)? (\s*(?Pnext|this|last)?\s*)? (?Pyears?|months?|fortnights?|weeks?|days?|hours?|h|minutes?|mins?|m|seconds?|secs?|s|yesterday|tomorrow|now|today|(?P[a-z]{3,9}))\b @@ -67,7 +67,7 @@ pub fn parse_relative_time_at_date( (\s*(?Pago)?)?", )?; - let mut is_ago = s.contains(" ago"); + let mut is_ago = s.to_ascii_lowercase().contains(" ago"); let mut captures_processed = 0; let mut total_length = 0; @@ -81,7 +81,10 @@ pub fn parse_relative_time_at_date( .chars() .filter(|c| !c.is_whitespace()) // Remove potential space between +/- and number .collect(); - let direction = capture.name("direction").map_or("", |d| d.as_str()); + let direction = capture + .name("direction") + .map_or("", |d| d.as_str()) + .to_ascii_lowercase(); let value = if value_str.is_empty() { if direction == "this" { 0 @@ -107,7 +110,7 @@ pub fn parse_relative_time_at_date( is_ago = true; } - let new_datetime = match unit { + let new_datetime = match unit.to_ascii_lowercase().as_str() { "years" | "year" => add_months(datetime, value * 12, is_ago), "months" | "month" => add_months(datetime, value, is_ago), "fortnights" | "fortnight" => add_days(datetime, value * 14, is_ago), @@ -1021,4 +1024,16 @@ mod tests { Err(ParseDateTimeError::InvalidInput) ); } + + #[test] + fn test_parse_relative_time_at_date_with_uppercase() { + let tests = vec!["today", "last week", "next month", "1 year ago"]; + let now = Utc::now(); + for t in tests { + assert_eq!( + parse_relative_time_at_date(now, &t.to_uppercase()).unwrap(), + parse_relative_time_at_date(now, t).unwrap(), + ); + } + } }