#[allow(unused_imports)]
pub(crate) use lazy_static::lazy_static;
pub(crate) mod fmt;
pub(crate) mod locales;
pub(crate) mod util;
pub use crate::fmt::format_l10n;
use chrono::{
format::{Item, StrftimeItems},
FixedOffset, NaiveDate, NaiveTime, Offset, TimeZone,
};
pub trait LocaleDate {
fn formatl<'a>(&self, fmt: &'a str, locale: &str) -> DelayedFormatL10n<StrftimeItems<'a>>;
}
impl LocaleDate for chrono::NaiveDate {
fn formatl<'a>(&self, fmt: &'a str, locale: &str) -> DelayedFormatL10n<StrftimeItems<'a>> {
DelayedFormatL10n::new(Some(*self), None, StrftimeItems::new(fmt), locale)
}
}
impl LocaleDate for chrono::NaiveDateTime {
fn formatl<'a>(&self, fmt: &'a str, locale: &str) -> DelayedFormatL10n<StrftimeItems<'a>> {
DelayedFormatL10n::new(Some(self.date()), Some(self.time()), StrftimeItems::new(fmt), locale)
}
}
impl<Tz: TimeZone> LocaleDate for chrono::DateTime<Tz> {
fn formatl<'a>(&self, fmt: &'a str, locale: &str) -> DelayedFormatL10n<StrftimeItems<'a>> {
let local = self.naive_local();
let offset = self.offset().fix();
DelayedFormatL10n::new_with_offset(Some(local.date()), Some(local.time()), &offset, StrftimeItems::new(fmt), locale)
}
}
#[derive(Debug)]
pub struct DelayedFormatL10n<I> {
locale: String,
date: Option<NaiveDate>,
time: Option<NaiveTime>,
off: Option<(String, FixedOffset)>,
items: I,
}
impl<'a, I: Iterator<Item = Item<'a>> + Clone> DelayedFormatL10n<I> {
pub fn new(date: Option<NaiveDate>, time: Option<NaiveTime>, items: I, locale: &str) -> DelayedFormatL10n<I> {
DelayedFormatL10n {
date,
time,
off: None,
items,
locale: locale.to_owned(),
}
}
pub fn new_with_offset(date: Option<NaiveDate>, time: Option<NaiveTime>, offset: &FixedOffset, items: I, locale: &str) -> DelayedFormatL10n<I> {
let name_and_diff = (offset.to_string(), offset.to_owned());
DelayedFormatL10n {
date,
time,
off: Some(name_and_diff),
items,
locale: locale.to_owned(),
}
}
}
impl<'a, I: Iterator<Item = Item<'a>> + Clone> std::fmt::Display for DelayedFormatL10n<I> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
format_l10n(
f,
self.date.as_ref(),
self.time.as_ref(),
self.off.as_ref(),
self.items.clone(),
&self.locale,
)
}
}