pub mod date_format;
pub mod date_kind;
pub mod output;
pub use date_format::DateFormat;
pub use date_kind::DateKind;
use chrono::{DateTime, SecondsFormat, Utc};
pub fn get_date_format(kind: &DateKind, format: Option<DateFormat>) -> DateFormat {
match format {
Some(format) => format,
None => match kind {
DateKind::Now => DateFormat::Rfc3339,
DateKind::Timestamp => DateFormat::Timestamp,
DateKind::Today => DateFormat::Rfc3339Date,
DateKind::Tomorrow => DateFormat::Rfc3339Date,
DateKind::Yesterday => DateFormat::Rfc3339Date,
},
}
}
pub fn get_date_time(date: DateTime<Utc>, kind: &DateKind) -> chrono::DateTime<Utc> {
match kind {
DateKind::Now => date,
DateKind::Today => date,
DateKind::Timestamp => date,
DateKind::Tomorrow => date + chrono::Duration::days(1),
DateKind::Yesterday => date + chrono::Duration::days(-1),
}
}
pub fn format_date_time(date: &DateTime<Utc>, format: &DateFormat) -> String {
match format {
DateFormat::Rfc3339 => date.to_rfc3339_opts(SecondsFormat::Millis, true),
DateFormat::Rfc3339Date => {
let formatted = date.to_rfc3339_opts(SecondsFormat::Millis, true);
formatted.split('T').next().unwrap().to_string()
}
DateFormat::Rfc3339Time => {
let formatted = date.to_rfc3339_opts(SecondsFormat::Millis, true);
formatted.split('T').nth(1).unwrap().to_string()
}
DateFormat::Timestamp => date.timestamp().to_string(),
DateFormat::TimestampMs => date.timestamp_millis().to_string(),
DateFormat::Rfc2882 => date.to_rfc2822(),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_date_time() {
let date = DateTime::parse_from_rfc3339("2023-05-15T10:30:15.123Z")
.unwrap()
.with_timezone(&Utc);
let now_result = get_date_time(date, &DateKind::Now);
assert_eq!(date, now_result);
let timestamp_result = get_date_time(date, &DateKind::Timestamp);
assert_eq!(date, timestamp_result);
let today_result = get_date_time(date, &DateKind::Today);
assert_eq!(date, today_result);
let yesterday_result = get_date_time(date, &DateKind::Yesterday);
assert_eq!(date + chrono::Duration::days(-1), yesterday_result);
let tomorrow_result = get_date_time(date, &DateKind::Tomorrow);
assert_eq!(date + chrono::Duration::days(1), tomorrow_result);
}
#[test]
fn test_get_date_format() {
assert_eq!(
get_date_format(&DateKind::Now, Some(DateFormat::Timestamp)),
DateFormat::Timestamp
);
assert_eq!(get_date_format(&DateKind::Now, None), DateFormat::Rfc3339);
assert_eq!(
get_date_format(&DateKind::Timestamp, None),
DateFormat::Timestamp
);
assert_eq!(
get_date_format(&DateKind::Today, None),
DateFormat::Rfc3339Date
);
assert_eq!(
get_date_format(&DateKind::Tomorrow, None),
DateFormat::Rfc3339Date
);
assert_eq!(
get_date_format(&DateKind::Yesterday, None),
DateFormat::Rfc3339Date
);
}
#[test]
fn test_format_date_time() {
let date = DateTime::parse_from_rfc3339("2023-05-15T10:30:15.123Z")
.unwrap()
.with_timezone(&Utc);
assert_eq!(
format_date_time(&date, &DateFormat::Rfc3339),
"2023-05-15T10:30:15.123Z"
);
assert_eq!(
format_date_time(&date, &DateFormat::Rfc3339Date),
"2023-05-15"
);
assert_eq!(
format_date_time(&date, &DateFormat::Rfc3339Time),
"10:30:15.123Z"
);
assert_eq!(
format_date_time(&date, &DateFormat::Timestamp),
"1684146615"
);
assert_eq!(
format_date_time(&date, &DateFormat::TimestampMs),
"1684146615123"
);
assert_eq!(
format_date_time(&date, &DateFormat::Rfc2882),
"Mon, 15 May 2023 10:30:15 +0000"
);
}
}