Skip to content

Commit

Permalink
Add initial conversions between Formatter and Names
Browse files Browse the repository at this point in the history
  • Loading branch information
sffc committed Feb 13, 2025
1 parent 9238422 commit b668586
Show file tree
Hide file tree
Showing 5 changed files with 355 additions and 76 deletions.
91 changes: 61 additions & 30 deletions components/datetime/src/neo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ size_test!(FixedCalendarDateTimeFormatter<icu_calendar::Gregorian, crate::fields
#[derive(Debug)]
pub struct FixedCalendarDateTimeFormatter<C: CldrCalendar, FSet: DateTimeNamesMarker> {
selection: DateTimeZonePatternSelectionData,
names: RawDateTimeNames<FSet>,
pub(crate) names: RawDateTimeNames<FSet>,
_calendar: PhantomData<C>,
}

Expand Down Expand Up @@ -356,8 +356,8 @@ size_test!(
#[derive(Debug)]
pub struct DateTimeFormatter<FSet: DateTimeNamesMarker> {
selection: DateTimeZonePatternSelectionData,
names: RawDateTimeNames<FSet>,
calendar: AnyCalendar,
pub(crate) names: RawDateTimeNames<FSet>,
pub(crate) calendar: AnyCalendar,
}

impl<FSet: DateTimeMarkers> DateTimeFormatter<FSet>
Expand Down Expand Up @@ -469,37 +469,68 @@ where
{
let calendar = AnyCalendarLoader::load(loader, (&prefs).into())
.map_err(DateTimeFormatterLoadError::Data)?;
let names = RawDateTimeNames::new_without_number_formatting();
Self::try_new_internal_with_calendar_and_names(
provider, provider, loader, prefs, field_set, calendar, names,
)
.map_err(|e| e.0)
}

pub(crate) fn try_new_internal_with_calendar_and_names<P0, P1, L>(
provider_p: &P0,
provider: &P1,
loader: &L,
prefs: DateTimeFormatterPreferences,
field_set: CompositeFieldSet,
calendar: AnyCalendar,
mut names: RawDateTimeNames<FSet>,
) -> Result<
Self,
(
DateTimeFormatterLoadError,
(AnyCalendar, RawDateTimeNames<FSet>),
),
>
where
P0: ?Sized + AllAnyCalendarPatternDataMarkers<FSet>,
P1: ?Sized + AllAnyCalendarFormattingDataMarkers<FSet>,
L: DecimalFormatterLoader,
{
let kind = calendar.kind();
let selection = DateTimeZonePatternSelectionData::try_new_with_skeleton(
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Skel, _>::new(provider, kind),
&<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1::bind(provider),
&FSet::GluePatternV1::bind(provider),
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Skel, _>::new(provider_p, kind),
&<FSet::T as TimeMarkers>::TimeSkeletonPatternsV1::bind(provider_p),
&FSet::GluePatternV1::bind(provider_p),
prefs,
field_set,
)
.map_err(DateTimeFormatterLoadError::Data)?;
let mut names = RawDateTimeNames::new_without_number_formatting();
names
.load_for_pattern(
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Year, _>::new(provider, kind),
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Month, _>::new(provider, kind),
&<FSet::D as DateDataMarkers>::WeekdayNamesV1::bind(provider),
&<FSet::T as TimeMarkers>::DayPeriodNamesV1::bind(provider),
&<FSet::Z as ZoneMarkers>::EssentialsV1::bind(provider),
&<FSet::Z as ZoneMarkers>::LocationsV1::bind(provider),
&<FSet::Z as ZoneMarkers>::LocationsRootV1::bind(provider),
&<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1::bind(provider),
&<FSet::Z as ZoneMarkers>::ExemplarCitiesV1::bind(provider),
&<FSet::Z as ZoneMarkers>::GenericLongV1::bind(provider),
&<FSet::Z as ZoneMarkers>::GenericShortV1::bind(provider),
&<FSet::Z as ZoneMarkers>::SpecificLongV1::bind(provider),
&<FSet::Z as ZoneMarkers>::SpecificShortV1::bind(provider),
&<FSet::Z as ZoneMarkers>::MetazonePeriodV1::bind(provider),
loader, // fixed decimal formatter
prefs,
selection.pattern_items_for_data_loading(),
)
.map_err(DateTimeFormatterLoadError::Names)?;
);
let selection = match selection {
Ok(selection) => selection,
Err(e) => return Err((DateTimeFormatterLoadError::Data(e), (calendar, names))),
};
let result = names.load_for_pattern(
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Year, _>::new(provider, kind),
&AnyCalendarProvider::<<FSet::D as DateDataMarkers>::Month, _>::new(provider, kind),
&<FSet::D as DateDataMarkers>::WeekdayNamesV1::bind(provider),
&<FSet::T as TimeMarkers>::DayPeriodNamesV1::bind(provider),
&<FSet::Z as ZoneMarkers>::EssentialsV1::bind(provider),
&<FSet::Z as ZoneMarkers>::LocationsV1::bind(provider),
&<FSet::Z as ZoneMarkers>::LocationsRootV1::bind(provider),
&<FSet::Z as ZoneMarkers>::ExemplarCitiesRootV1::bind(provider),
&<FSet::Z as ZoneMarkers>::ExemplarCitiesV1::bind(provider),
&<FSet::Z as ZoneMarkers>::GenericLongV1::bind(provider),
&<FSet::Z as ZoneMarkers>::GenericShortV1::bind(provider),
&<FSet::Z as ZoneMarkers>::SpecificLongV1::bind(provider),
&<FSet::Z as ZoneMarkers>::SpecificShortV1::bind(provider),
&<FSet::Z as ZoneMarkers>::MetazonePeriodV1::bind(provider),
loader, // fixed decimal formatter
prefs,
selection.pattern_items_for_data_loading(),
);
match result {
Ok(()) => (),
Err(e) => return Err((DateTimeFormatterLoadError::Names(e), (calendar, names))),
};
Ok(Self {
selection,
names,
Expand Down
1 change: 1 addition & 0 deletions components/datetime/src/pattern/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::error::ErrorField;
pub use formatter::DateTimePatternFormatter;
pub use formatter::FormattedDateTimePattern;
use icu_pattern::SinglePlaceholderPattern;
pub use names::DateTimeNames;
pub use names::DayPeriodNameLength;
pub use names::MonthNameLength;
pub(crate) use names::RawDateTimeNames;
Expand Down
Loading

0 comments on commit b668586

Please sign in to comment.