use bc_envelope::prelude::*;
use crate::{Error, Pattern, Result};
pub(crate) fn parse_date_content(content: String) -> Result<Pattern> {
if content.starts_with('/') && content.ends_with('/') {
let regex_str = &content[1..content.len() - 1];
let regex = regex::Regex::new(regex_str)
.map_err(|_| Error::InvalidRegex(0..content.len()))?;
return Ok(Pattern::date_regex(regex));
}
if content.contains("...") {
let parts: Vec<&str> = content.split("...").collect();
if parts.len() == 2 {
let start_str = parts[0];
let end_str = parts[1];
if start_str.is_empty() {
let date = Date::from_string(end_str)
.map_err(|_| Error::InvalidDateFormat(0..content.len()))?;
return Ok(Pattern::date_latest(date));
} else if end_str.is_empty() {
let date = Date::from_string(start_str)
.map_err(|_| Error::InvalidDateFormat(0..content.len()))?;
return Ok(Pattern::date_earliest(date));
} else {
let start_date = Date::from_string(start_str)
.map_err(|_| Error::InvalidDateFormat(0..content.len()))?;
let end_date = Date::from_string(end_str)
.map_err(|_| Error::InvalidDateFormat(0..content.len()))?;
return Ok(Pattern::date_range(start_date..=end_date));
}
}
}
let date = Date::from_string(&content)
.map_err(|_| Error::InvalidDateFormat(0..content.len()))?;
Ok(Pattern::date(date))
}