use jcore::tz::posix;
use crate::fmt;
pub(crate) struct TimeZoneFormatter<'a>(pub(crate) &'a posix::TimeZone);
impl<'a> core::fmt::Display for TimeZoneFormatter<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
fmt::temporal::DateTimePrinter::new()
.print_posix_time_zone(self.0, fmt::StdFmtWrite(f))
.map_err(|_| core::fmt::Error)
}
}
impl<'a> core::fmt::Debug for TimeZoneFormatter<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
core::fmt::Display::fmt(self, f)
}
}
#[cfg(feature = "defmt")]
impl<'a> defmt::Format for TimeZoneFormatter<'a> {
fn format(&self, f: defmt::Formatter) {
defmt::unwrap!(fmt::temporal::DateTimePrinter::new()
.print_posix_time_zone(self.0, fmt::DefmtWrite(f)))
}
}
#[cfg(feature = "alloc")]
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "alloc")]
#[test]
fn roundtrips() {
fn assert_roundtrip(tz: &str) {
use alloc::string::{String, ToString};
use jcore::tz::posix;
fn to_string(tz: &posix::TimeZone) -> String {
TimeZoneFormatter(tz).to_string()
}
let tz = posix::TimeZone::parse(tz).unwrap();
let reparsed = posix::TimeZone::parse(to_string(&tz)).unwrap();
assert_eq!(tz, reparsed);
assert_eq!(to_string(&tz), to_string(&reparsed));
}
let cases = [
"WART4WARST,J1/-3,J365/20",
"WART4WARST,J1/-4,J365/21",
"EST5EDT,M3.2.0,M11.1.0",
"XXX-2<+01>-1,0/0,J365/23",
"EST24EDT,J1,J365",
"EST-24EDT,J1,J365",
"EST5EDT,J1,J365/5:12:34",
"EST+5EDT,M3.2.0/2,M11.1.0/2",
"EST+5EDT,M1.1.1,M12.5.2",
"EST5EDT,0/0,J365/25",
"XXX3EDT4,0/0,J365/23",
"XXX3EDT4,0/0,365",
"XXX3EDT4,J1/-167:59:59,J365/167:59:59",
"EST5EDT,J1,J365/5:12:34",
"EST+5EDT,M3.2.0/2,M11.1.0/2",
"EST+5EDT,J60,J365",
"EST+5EDT,59,365",
"EST+5EDT,M1.1.1,M12.5.2",
"EST5EDT,J1,J365/5:12:34",
"EST5EDT,J1/23:59:59,J365/24:00:00",
"EST5EDT,J1/-1,J365/167:00:00",
];
for tz in cases {
assert_roundtrip(tz);
}
}
}