// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
#![allow(dead_code)] // features in here are a mess
use alloc::boxed::Box;
use icu_calendar::Gregorian;
use icu_datetime::{
fieldsets::builder::BuilderError, fieldsets::enums::*, fieldsets::Combo, pattern::*,
scaffold::*, DateTimeFormatter, DateTimeFormatterLoadError, FixedCalendarDateTimeFormatter,
};
pub(crate) fn map_or_default(input: Option) -> Output
where
Output: From + Default,
{
input.map(Output::from).unwrap_or_default()
}
pub(super) fn date_formatter_with_zone(
formatter: &DateTimeFormatter,
locale: &crate::unstable::locale_core::ffi::Locale,
zone: Zone,
load: impl FnOnce(
&mut DateTimeNames>,
) -> Result<(), crate::unstable::errors::ffi::DateTimeFormatterLoadError>,
to_formatter: impl FnOnce(
DateTimeNames>,
Combo,
) -> Result<
DateTimeFormatter>,
(
DateTimeFormatterLoadError,
DateTimeNames>,
),
>,
) -> Result<
Box,
crate::unstable::errors::ffi::DateTimeFormatterLoadError,
>
where
Zone: DateTimeMarkers + ZoneMarkers,
::Z: ZoneMarkers,
Combo: DateTimeNamesFrom,
ZonedDateFieldSet: DateTimeNamesFrom>,
{
let prefs = (&locale.0).into();
let mut names = DateTimeNames::from_formatter(prefs, formatter.clone())
.cast_into_fset::>();
load(&mut names)?;
let field_set = formatter
.to_field_set_builder()
.build_date()
.map_err(|e| match e {
BuilderError::InvalidDateFields => {
// This can fail if the date fields are for a calendar period
crate::unstable::errors::ffi::DateTimeFormatterLoadError::InvalidDateFields
}
_ => {
debug_assert!(false, "should be infallible, but got: {e:?}");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::Unknown
}
})?
.with_zone(zone);
let formatter = to_formatter(names, field_set)
// This can fail if the locale doesn't match and the fields conflict
.map_err(|(e, _)| e)?
.cast_into_fset();
Ok(Box::new(
crate::unstable::zoned_date_formatter::ffi::ZonedDateFormatter(formatter),
))
}
pub(super) fn datetime_formatter_with_zone(
formatter: &DateTimeFormatter,
locale: &crate::unstable::locale_core::ffi::Locale,
zone: Zone,
load: impl FnOnce(
&mut DateTimeNames>,
) -> Result<(), crate::unstable::errors::ffi::DateTimeFormatterLoadError>,
to_formatter: impl FnOnce(
DateTimeNames>,
Combo,
) -> Result<
DateTimeFormatter>,
(
DateTimeFormatterLoadError,
DateTimeNames>,
),
>,
) -> Result<
Box,
crate::unstable::errors::ffi::DateTimeFormatterLoadError,
>
where
Zone: DateTimeMarkers + ZoneMarkers,
::Z: ZoneMarkers,
Combo: DateTimeNamesFrom,
ZonedDateAndTimeFieldSet: DateTimeNamesFrom>,
{
let prefs = (&locale.0).into();
let mut names = DateTimeNames::from_formatter(prefs, formatter.clone())
.cast_into_fset::>();
load(&mut names)?;
let field_set = formatter
.to_field_set_builder()
.build_date_and_time()
.map_err(|e| match e {
BuilderError::InvalidDateFields => {
debug_assert!(false, "fields were already validated in DateTimeFormatter");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::InvalidDateFields
}
_ => {
debug_assert!(false, "should be infallible, but got: {e:?}");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::Unknown
}
})?
.with_zone(zone);
let formatter = to_formatter(names, field_set)
// This can fail if the locale doesn't match and the fields conflict
.map_err(|(e, _)| e)?
.cast_into_fset();
Ok(Box::new(
crate::unstable::zoned_date_time_formatter::ffi::ZonedDateTimeFormatter(formatter),
))
}
pub(super) fn date_formatter_gregorian_with_zone(
formatter: &FixedCalendarDateTimeFormatter,
locale: &crate::unstable::locale_core::ffi::Locale,
zone: Zone,
load: impl FnOnce(
&mut FixedCalendarDateTimeNames>,
) -> Result<(), crate::unstable::errors::ffi::DateTimeFormatterLoadError>,
to_formatter: impl FnOnce(
FixedCalendarDateTimeNames>,
Combo,
) -> Result<
FixedCalendarDateTimeFormatter>,
(
DateTimeFormatterLoadError,
FixedCalendarDateTimeNames>,
),
>,
) -> Result<
Box,
crate::unstable::errors::ffi::DateTimeFormatterLoadError,
>
where
Zone: DateTimeMarkers + ZoneMarkers,
::Z: ZoneMarkers,
Combo: DateTimeNamesFrom,
ZonedDateFieldSet: DateTimeNamesFrom>,
{
let prefs = (&locale.0).into();
let mut names = FixedCalendarDateTimeNames::from_formatter(prefs, formatter.clone())
.cast_into_fset::>();
load(&mut names)?;
let field_set = formatter
.to_field_set_builder()
.build_date()
.map_err(|e| match e {
BuilderError::InvalidDateFields => {
// This can fail if the date fields are for a calendar period
crate::unstable::errors::ffi::DateTimeFormatterLoadError::InvalidDateFields
}
_ => {
debug_assert!(false, "should be infallible, but got: {e:?}");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::Unknown
}
})?
.with_zone(zone);
let formatter = to_formatter(names, field_set)
// This can fail if the locale doesn't match and the fields conflict
.map_err(|(e, _)| e)?
.cast_into_fset();
Ok(Box::new(
crate::unstable::zoned_date_formatter::ffi::ZonedDateFormatterGregorian(formatter),
))
}
pub(super) fn datetime_formatter_gregorian_with_zone(
formatter: &FixedCalendarDateTimeFormatter,
locale: &crate::unstable::locale_core::ffi::Locale,
zone: Zone,
load: impl FnOnce(
&mut FixedCalendarDateTimeNames>,
) -> Result<(), crate::unstable::errors::ffi::DateTimeFormatterLoadError>,
to_formatter: impl FnOnce(
FixedCalendarDateTimeNames>,
Combo,
) -> Result<
FixedCalendarDateTimeFormatter>,
(
DateTimeFormatterLoadError,
FixedCalendarDateTimeNames>,
),
>,
) -> Result<
Box,
crate::unstable::errors::ffi::DateTimeFormatterLoadError,
>
where
Zone: DateTimeMarkers + ZoneMarkers,
::Z: ZoneMarkers,
Combo: DateTimeNamesFrom,
ZonedDateAndTimeFieldSet: DateTimeNamesFrom>,
{
let prefs = (&locale.0).into();
let mut names = FixedCalendarDateTimeNames::from_formatter(prefs, formatter.clone())
.cast_into_fset::>();
load(&mut names)?;
let field_set = formatter
.to_field_set_builder()
.build_date_and_time()
.map_err(|e| match e {
BuilderError::InvalidDateFields => {
debug_assert!(false, "fields were already validated in DateTimeFormatter");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::InvalidDateFields
}
_ => {
debug_assert!(false, "should be infallible, but got: {e:?}");
crate::unstable::errors::ffi::DateTimeFormatterLoadError::Unknown
}
})?
.with_zone(zone);
let formatter = to_formatter(names, field_set)
// This can fail if the locale doesn't match and the fields conflict
.map_err(|(e, _)| e)?
.cast_into_fset();
Ok(Box::new(
crate::unstable::zoned_date_time_formatter::ffi::ZonedDateTimeFormatterGregorian(formatter),
))
}