use chrono_tz::Tz;
use crate::util::{Locale, Utf16String};
use super::temporal_formatting_utils::TemporalFormattingError;
use super::{TemporalFormattingUtils, TemporalValue};
pub struct TemporalArrayUtils {
formatting: TemporalFormattingUtils,
}
impl TemporalArrayUtils {
pub fn new(locale: Locale, default_zone_id: Tz) -> Result<Self, TemporalFormattingError> {
Ok(Self {
formatting: TemporalFormattingUtils::new(locale, default_zone_id)?,
})
}
pub fn array_format(
&self,
target: &[Option<TemporalValue>],
pattern: Option<&str>,
locale: Option<&Locale>,
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
target
.iter()
.map(|value| {
self.formatting
.format(value.as_ref(), pattern, locale, None)
})
.collect()
}
pub fn array_day(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.day(value))
}
pub fn array_month(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.month(value))
}
pub fn array_year(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.year(value))
}
pub fn array_day_of_week(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.day_of_week(value))
}
pub fn array_hour(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.hour(value))
}
pub fn array_minute(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.minute(value))
}
pub fn array_second(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.second(value))
}
pub fn array_nanosecond(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
self.map_integer(target, |utils, value| utils.nanosecond(value))
}
pub fn array_month_name(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
self.array_format(target, Some("MMMM"), None)
}
pub fn array_month_name_short(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
self.array_format(target, Some("MMM"), None)
}
pub fn array_day_of_week_name(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
self.array_format(target, Some("EEEE"), None)
}
pub fn array_day_of_week_name_short(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
self.array_format(target, Some("EEE"), None)
}
pub fn array_format_iso(
&self,
target: &[Option<TemporalValue>],
) -> Result<Vec<Option<Utf16String>>, TemporalFormattingError> {
target
.iter()
.map(|value| self.formatting.format_iso(value.as_ref()))
.collect()
}
fn map_integer(
&self,
target: &[Option<TemporalValue>],
mapper: impl Fn(
&TemporalFormattingUtils,
Option<&TemporalValue>,
) -> Result<Option<i32>, TemporalFormattingError>,
) -> Result<Vec<Option<i32>>, TemporalFormattingError> {
target
.iter()
.map(|value| mapper(&self.formatting, value.as_ref()))
.collect()
}
}