Skip to content

Commit

Permalink
Add day periods adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
sffc committed Oct 20, 2023
1 parent 3d39124 commit 3dbd6cd
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 2 deletions.
1 change: 1 addition & 0 deletions components/datetime/src/provider/calendar/symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ macro_rules! symbols {
self.stand_alone.as_ref().and_then(|x| x.narrow.as_ref())
}
/// Convenience function to return stand-alone short as an `Option<&>`.
#[allow(dead_code)] // not all symbols have a short variant
pub(crate) fn stand_alone_short(&self) -> Option<&SymbolsV1<'data>> {
self.stand_alone.as_ref().and_then(|x| x.short.as_ref())
}
Expand Down
87 changes: 85 additions & 2 deletions components/datetime/src/provider/neo/transform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,44 @@ where
})
}

fn dayperiod_symbols_map_project_cloned<M, P>(
payload: &DataPayload<M>,
req: DataRequest,
) -> Result<DataResponse<P>, DataError>
where
M: KeyedDataMarker<Yokeable = TimeSymbolsV1<'static>>,
P: KeyedDataMarker<Yokeable = LinearSymbolsV1<'static>>,
{
let subtag = req
.locale
.get_aux()
.and_then(|aux| aux.iter().next())
.unwrap();
let new_payload = payload.map_project_cloned(|payload, _| {
use subtag_consts::*;
let result = match subtag {
STADLN_ABBR => payload.day_periods.stand_alone_abbreviated(),
STADLN_WIDE => payload.day_periods.stand_alone_wide(),
STADLN_NARW => payload.day_periods.stand_alone_narrow(),
_ => None,
};
if let Some(result) = result {
return result.into();
}
let result = match subtag {
STADLN_ABBR | FORMAT_ABBR => &payload.day_periods.format.abbreviated,
STADLN_WIDE | FORMAT_WIDE => &payload.day_periods.format.wide,
STADLN_NARW | FORMAT_NARW => &payload.day_periods.format.narrow,
_ => panic!("Unknown aux key subtag: {subtag}"),
};
return result.into();
});
Ok(DataResponse {
payload: Some(new_payload),
metadata: Default::default(),
})
}

impl<'a> From<&months::SymbolsV1<'a>> for MonthSymbolsV1<'a> {
fn from(other: &months::SymbolsV1<'a>) -> Self {
match other {
Expand Down Expand Up @@ -137,6 +175,21 @@ impl<'a> From<&weekdays::SymbolsV1<'a>> for LinearSymbolsV1<'a> {
}
}

impl<'a> From<&day_periods::SymbolsV1<'a>> for LinearSymbolsV1<'a> {
fn from(other: &day_periods::SymbolsV1<'a>) -> Self {
// Input is a struct with four fields. Need to make it a VarZeroVec.
let vec: alloc::vec::Vec<&str> = match (other.noon.as_ref(), other.midnight.as_ref()) {
(Some(noon), Some(midnight)) => vec![&other.am, &other.pm, &noon, &midnight],
(Some(noon), None) => vec![&other.am, &other.pm, &noon],
(None, Some(midnight)) => vec![&other.am, &other.pm, "", &midnight],
(None, None) => vec![&other.am, &other.pm]
};
LinearSymbolsV1 {
symbols: (&vec).into(),
}
}
}

macro_rules! impl_data_provider_adapter {
($old_ty:ty, $new_ty:ty, $cnv:ident) => {
impl DataProvider<$new_ty> for DataPayload<$old_ty> {
Expand Down Expand Up @@ -167,6 +220,11 @@ impl_data_provider_adapter!(
WeekdaySymbolsV1Marker,
weekday_symbols_map_project_cloned
);
impl_data_provider_adapter!(
TimeSymbolsV1Marker,
DayPeriodSymbolsV1Marker,
dayperiod_symbols_map_project_cloned
);

#[cfg(test)]
mod tests {
Expand Down Expand Up @@ -258,7 +316,7 @@ mod tests {
.unwrap()
.take_payload()
.unwrap();
let neo_weekdays_abbreviated: DataPayload<WeekdaySymbolsV1Marker> = symbols
let neo_weekdays_short: DataPayload<WeekdaySymbolsV1Marker> = symbols
.load(DataRequest {
locale: &"en-x-6s".parse().unwrap(),
metadata: Default::default(),
Expand All @@ -268,8 +326,33 @@ mod tests {
.unwrap();

assert_eq!(
format!("{neo_weekdays_abbreviated:?}"),
format!("{neo_weekdays_short:?}"),
"LinearSymbolsV1 { symbols: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] }"
);
}

#[test]
fn test_transform_dayperiods() {
let symbols: DataPayload<TimeSymbolsV1Marker> = crate::provider::Baked
.load(DataRequest {
locale: &locale!("en").into(),
metadata: Default::default(),
})
.unwrap()
.take_payload()
.unwrap();
let neo_dayperiods_abbreviated: DataPayload<DayPeriodSymbolsV1Marker> = symbols
.load(DataRequest {
locale: &"en-x-3s".parse().unwrap(),
metadata: Default::default(),
})
.unwrap()
.take_payload()
.unwrap();

assert_eq!(
format!("{neo_dayperiods_abbreviated:?}"),
"LinearSymbolsV1 { symbols: [\"AM\", \"PM\", \"noon\", \"midnight\"] }"
);
}
}

0 comments on commit 3dbd6cd

Please sign in to comment.