use std::{fmt::Write as _, marker::PhantomData};
use crate::{
formatter::pattern_formatter::{Pattern, PatternContext},
Error, Record, StringBuf,
};
#[derive(Clone, Default)]
pub struct AbbrWeekdayName;
impl Pattern for AbbrWeekdayName {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().weekday_name().short)
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct WeekdayName;
impl Pattern for WeekdayName {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().weekday_name().full)
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct AbbrMonthName;
impl Pattern for AbbrMonthName {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().month_name().short)
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct MonthName;
impl Pattern for MonthName {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().month_name().full)
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct FullDateTime;
impl Pattern for FullDateTime {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().weekday_name().short)?;
dest.write_char(' ')?;
dest.write_str(ctx.time_date().month_name().short)?;
dest.write_char(' ')?;
dest.write_str(ctx.time_date().day_str())?;
dest.write_char(' ')?;
dest.write_str(ctx.time_date().hour_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().minute_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().second_str())?;
dest.write_char(' ')?;
dest.write_str(ctx.time_date().year_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct ShortYear;
impl Pattern for ShortYear {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().year_short_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Year;
impl Pattern for Year {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().year_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Date;
impl Pattern for Date {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().year_str())?;
dest.write_char('-')?;
dest.write_str(ctx.time_date().month_str())?;
dest.write_char('-')?;
dest.write_str(ctx.time_date().day_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct ShortDate;
impl Pattern for ShortDate {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().month_str())?;
dest.write_char('/')?;
dest.write_str(ctx.time_date().day_str())?;
dest.write_char('/')?;
dest.write_str(ctx.time_date().year_short_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Month;
impl Pattern for Month {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().month_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Day;
impl Pattern for Day {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().day_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Hour;
impl Pattern for Hour {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().hour_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Hour12;
impl Pattern for Hour12 {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().hour12_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Minute;
impl Pattern for Minute {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().minute_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Second;
impl Pattern for Second {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().second_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Millisecond {
_phantom: PhantomData<()>,
}
impl Pattern for Millisecond {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
write!(dest, "{:03}", ctx.time_date().millisecond()).map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Microsecond;
impl Pattern for Microsecond {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
let nanosecond = ctx.time_date().nanosecond();
write!(dest, "{:06}", nanosecond / 1_000).map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Nanosecond;
impl Pattern for Nanosecond {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
write!(dest, "{:09}", ctx.time_date().nanosecond()).map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct AmPm;
impl Pattern for AmPm {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().am_pm_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Time12;
impl Pattern for Time12 {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().hour12_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().minute_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().second_str())?;
dest.write_str(" ")?;
dest.write_str(ctx.time_date().am_pm_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct ShortTime;
impl Pattern for ShortTime {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().hour_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().minute_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct Time;
impl Pattern for Time {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
(|| {
dest.write_str(ctx.time_date().hour_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().minute_str())?;
dest.write_char(':')?;
dest.write_str(ctx.time_date().second_str())
})()
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct TzOffset;
impl Pattern for TzOffset {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().tz_offset_str())
.map_err(Error::FormatRecord)
}
}
#[derive(Clone, Default)]
pub struct UnixTimestamp;
impl Pattern for UnixTimestamp {
fn format(
&self,
_record: &Record,
dest: &mut StringBuf,
ctx: &mut PatternContext,
) -> crate::Result<()> {
dest.write_str(ctx.time_date().unix_timestamp_str())
.map_err(Error::FormatRecord)
}
}