// 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), )) }