use iso8601::{Date, DateTime, Time};
use xml::escape::escape_str_pcdata;
use std::borrow::Cow;
use std::fmt::Write;
pub fn escape_xml(s: &str) -> Cow<'_, str> {
escape_str_pcdata(s)
}
pub fn format_datetime(date_time: &DateTime) -> String {
let Time {
hour,
minute,
second,
millisecond,
tz_offset_hours,
tz_offset_minutes,
} = date_time.time;
match date_time.date {
Date::YMD { year, month, day } => {
let mut string = format!(
"{:04}{:02}{:02}T{:02}:{:02}:{:02}",
year, month, day, hour, minute, second
);
if millisecond > 0 {
write!(string, ".{:.3}", millisecond).unwrap();
}
if tz_offset_hours != 0 || tz_offset_minutes != 0 {
write!(
string,
"{:+03}:{:02}",
tz_offset_hours,
tz_offset_minutes.abs()
)
.unwrap();
}
string
}
Date::Week { .. } | Date::Ordinal { .. } => unimplemented!(),
}
}
#[cfg(test)]
mod tests {
use super::*;
use iso8601;
#[test]
fn formats_datetimes() {
let date_time = iso8601::datetime("2016-05-02T06:01:05-0830").unwrap();
let formatted = format_datetime(&date_time);
assert_eq!(formatted, "20160502T06:01:05-08:30");
assert_eq!(iso8601::datetime(&formatted).unwrap(), date_time);
let date_time = iso8601::datetime("20160502T06:01:05.400").unwrap();
let formatted = format_datetime(&date_time);
assert_eq!(formatted, "20160502T06:01:05.400");
assert_eq!(iso8601::datetime(&formatted).unwrap(), date_time);
let date_time = iso8601::datetime("20160502T06:01:05.400+01:02").unwrap();
let formatted = format_datetime(&date_time);
assert_eq!(formatted, "20160502T06:01:05.400+01:02");
assert_eq!(iso8601::datetime(&formatted).unwrap(), date_time);
}
}