#![allow(missing_docs)]
use dtt::datetime::{days_in_month, is_leap_year};
use dtt::prelude::*;
use dtt::{
dtt_clone, dtt_diff, dtt_diff_days, dtt_diff_seconds, dtt_format,
dtt_new_with_tz, dtt_print,
};
use time::Month;
fn main() -> Result<(), AppError> {
dtt_print!("== DTT macros showcase ==");
let mumbai = dtt_new_with_tz!("IST_INDIA");
println!("Mumbai now : {mumbai}");
let original = DateTime::parse("2024-01-15T10:30:00Z")?;
let copy = dtt_clone!(original);
assert_eq!(original, copy);
let pretty = dtt_format!(
original,
"{year}-{month}-{day}T{hour}:{minute}:{second}.{microsecond}{offset_sign}{offset_hour}:{offset_minute}"
);
println!("Formatted : {pretty}");
assert_eq!(pretty, "2024-01-15T10:30:00.000000+00:00");
let diff: Option<i64> = dtt_diff!("1609459200", "1609459260", 1);
assert_eq!(diff, Some(60));
let secs: Option<i64> =
dtt_diff_seconds!("1609459200", "1609459230");
println!("Seconds diff : {secs:?}");
assert_eq!(secs, Some(30));
let days: Option<i64> = dtt_diff_days!("1609459200", "1610064000");
println!("Days diff : {days:?}");
assert_eq!(days, Some(7));
let bad: Option<i64> = dtt_diff_seconds!("not-a-timestamp", "0");
assert_eq!(bad, None);
assert!(is_leap_year(2024));
assert!(!is_leap_year(2023));
assert!(is_leap_year(2000)); assert!(!is_leap_year(1900)); println!("is_leap(2024) : true");
assert_eq!(days_in_month(2024, 2)?, 29); assert_eq!(days_in_month(2023, 2)?, 28);
assert_eq!(days_in_month(2024, 4)?, 30);
assert_eq!(days_in_month(2024, 12)?, 31);
assert!(days_in_month(2024, 13).is_err());
println!("Days in Feb 24 : 29");
let epoch = DateTime::default();
println!("Epoch (default): {epoch}");
assert_eq!(epoch.unix_timestamp(), 0);
let ts = DateTime::parse("2024-01-15T10:30:00Z")?.unix_timestamp();
println!("Unix timestamp : {ts}");
Ok(())
}