Skip to content

Commit

Permalink
Change internal DateSymbols trait so it can be implemented on neo (#4203
Browse files Browse the repository at this point in the history
)
  • Loading branch information
sffc authored Oct 21, 2023
1 parent 1299c57 commit a120645
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 44 deletions.
22 changes: 6 additions & 16 deletions components/datetime/src/format/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,30 +307,20 @@ where
.ok_or(Error::MissingInputField(Some("month")))?
.code;

let symbols = date_symbols
let (symbol, is_leap) = date_symbols
.ok_or(Error::MissingDateSymbols)?
.get_symbols_for_month(month, length)?;

let symbol_option = symbols.get(code);
if symbol_option.is_some() {
w.write_str(symbol_option.ok_or(Error::MissingMonthSymbol(code))?)?;
} else {
let code = code
.get_normal_if_leap()
.ok_or(Error::MissingMonthSymbol(code))?;
let symbols = date_symbols
.ok_or(Error::MissingDateSymbols)?
.get_symbols_for_month(month, length)?;
let symbol = symbols.get(code).ok_or(Error::MissingMonthSymbol(code))?;
// FIXME (#3766) this should be using actual data for leap months
.get_symbol_for_month(month, length, code)?;

// FIXME (#3766) this should be using actual data for leap months
if is_leap {
let leap_str = match datetime.any_calendar_kind() {
Some(AnyCalendarKind::Chinese) => CHINESE_LEAP_PREFIX,
Some(AnyCalendarKind::Dangi) => DANGI_LEAP_PREFIX,
_ => PLACEHOLDER_LEAP_PREFIX,
};
w.write_str(leap_str)?;
w.write_str(symbol)?;
}
w.write_str(symbol)?;
}
},
FieldSymbol::Week(week) => match week {
Expand Down
81 changes: 53 additions & 28 deletions components/datetime/src/provider/date_time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::provider::calendar::{
#[cfg(feature = "experimental")]
use crate::{options::components, provider::calendar::DateSkeletonPatternsV1Marker};
use icu_calendar::types::Era;
use icu_calendar::types::MonthCode;
use icu_locid::extensions::unicode::Value;
use icu_provider::prelude::*;

Expand Down Expand Up @@ -309,11 +310,13 @@ where
}

pub trait DateSymbols<'data> {
fn get_symbols_for_month(
/// The bool is `true` if the return value is a leap month fallback needing a qualifier.
fn get_symbol_for_month(
&self,
month: fields::Month,
length: fields::FieldLength,
) -> Result<&months::SymbolsV1<'data>>;
code: MonthCode,
) -> Result<(&str, bool)>;
fn get_symbol_for_weekday(
&self,
weekday: fields::Weekday,
Expand All @@ -323,6 +326,40 @@ pub trait DateSymbols<'data> {
fn get_symbol_for_era<'a>(&'a self, length: fields::FieldLength, era_code: &'a Era) -> &str;
}

impl<'data> provider::calendar::DateSymbolsV1<'data> {
fn get_symbols_map_for_month(
&self,
month: fields::Month,
length: fields::FieldLength,
) -> Result<&months::SymbolsV1<'data>> {
let widths = match month {
fields::Month::Format => &self.months.format,
fields::Month::StandAlone => {
if let Some(ref widths) = self.months.stand_alone {
let symbols = match length {
fields::FieldLength::Wide => widths.wide.as_ref(),
fields::FieldLength::Narrow => widths.narrow.as_ref(),
_ => widths.abbreviated.as_ref(),
};
if let Some(symbols) = symbols {
return Ok(symbols);
} else {
return self.get_symbols_map_for_month(fields::Month::Format, length);
}
} else {
return self.get_symbols_map_for_month(fields::Month::Format, length);
}
}
};
let symbols = match length {
fields::FieldLength::Wide => &widths.wide,
fields::FieldLength::Narrow => &widths.narrow,
_ => &widths.abbreviated,
};
Ok(symbols)
}
}

impl<'data> DateSymbols<'data> for provider::calendar::DateSymbolsV1<'data> {
fn get_symbol_for_weekday(
&self,
Expand Down Expand Up @@ -372,36 +409,24 @@ impl<'data> DateSymbols<'data> for provider::calendar::DateSymbolsV1<'data> {
.ok_or(DateTimeError::MissingWeekdaySymbol(idx))
}

fn get_symbols_for_month(
fn get_symbol_for_month(
&self,
month: fields::Month,
length: fields::FieldLength,
) -> Result<&months::SymbolsV1<'data>> {
let widths = match month {
fields::Month::Format => &self.months.format,
fields::Month::StandAlone => {
if let Some(ref widths) = self.months.stand_alone {
let symbols = match length {
fields::FieldLength::Wide => widths.wide.as_ref(),
fields::FieldLength::Narrow => widths.narrow.as_ref(),
_ => widths.abbreviated.as_ref(),
};
if let Some(symbols) = symbols {
return Ok(symbols);
} else {
return self.get_symbols_for_month(fields::Month::Format, length);
}
} else {
return self.get_symbols_for_month(fields::Month::Format, length);
}
code: MonthCode,
) -> Result<(&str, bool)> {
let symbols_map = self.get_symbols_map_for_month(month, length)?;
let mut symbol_option = symbols_map.get(code);
let mut fallback = false;
if symbol_option.is_none() {
if let Some(code) = code.get_normal_if_leap() {
let symbols_map = self.get_symbols_map_for_month(month, length)?;
symbol_option = symbols_map.get(code);
fallback = true;
}
};
let symbols = match length {
fields::FieldLength::Wide => &widths.wide,
fields::FieldLength::Narrow => &widths.narrow,
_ => &widths.abbreviated,
};
Ok(symbols)
}
let symbol = symbol_option.ok_or(DateTimeError::MissingMonthSymbol(code))?;
Ok((symbol, fallback))
}

/// Get the era symbol
Expand Down

0 comments on commit a120645

Please sign in to comment.