Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions components/datetime/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ icu_locale = { workspace = true, optional = true }


[dev-dependencies]
calendrical_calculations = { workspace = true }
icu = { path = "../../components/icu", default-features = false }
icu_calendar = { path = "../calendar", features = ["ixdtf"] }
icu_provider_adapters = { path = "../../provider/adapters" }
Expand Down
57 changes: 56 additions & 1 deletion components/datetime/src/scaffold/calendar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,67 @@ impl CldrCalendar for Indian {
type SkeletaV1 = DatetimePatternsDateIndianV1;
}

impl<R: hijri::Rules> CldrCalendar for Hijri<R> {
/// [`hijri::Rules`]-specific formatting options.
///
/// See [`CldrCalendar`].
///
/// The simplest implementation of this uses the same names
/// as some provided [`hijri::Rules`]:
///
/// ```rust
/// use icu::calendar::cal::hijri;
/// use icu::datetime::scaffold::FormattableHijriRules;
///
/// #[derive(Clone, Debug)]
/// struct MyRules;
///
/// impl icu::calendar::cal::scaffold::UnstableSealed for MyRules {}
/// impl hijri::Rules for MyRules {
/// fn year_data(&self, _year: i32) -> hijri::HijriYearData { todo!() }
/// }
///
/// impl FormattableHijriRules for MyRules {
/// type YearNamesV1 = <hijri::UmmAlQura as FormattableHijriRules>::YearNamesV1;
/// type MonthNamesV1 = <hijri::UmmAlQura as FormattableHijriRules>::MonthNamesV1;
/// type SkeletaV1 = <hijri::UmmAlQura as FormattableHijriRules>::SkeletaV1;
/// }
/// ```
// TODO: default associated types would be nice (https://github.com/rust-lang/rust/issues/29661)
pub trait FormattableHijriRules: hijri::Rules {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UnstableSealed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well actually hijri::Rules is UnstableSealed, do we need to use one per crate?

/// The data marker for loading year symbols for this calendar.
type YearNamesV1: DataMarker<DataStruct = YearNames<'static>>;

/// The data marker for loading month symbols for this calendar.
type MonthNamesV1: DataMarker<DataStruct = MonthNames<'static>>;

/// The data marker for loading skeleton patterns for this calendar.
type SkeletaV1: DataMarker<DataStruct = PackedPatterns<'static>>;
}

impl FormattableHijriRules for hijri::TabularAlgorithm {
type YearNamesV1 = DatetimeNamesYearHijriV1;
type MonthNamesV1 = DatetimeNamesMonthHijriV1;
type SkeletaV1 = DatetimePatternsDateHijriV1;
}

impl FormattableHijriRules for hijri::UmmAlQura {
type YearNamesV1 = DatetimeNamesYearHijriV1;
type MonthNamesV1 = DatetimeNamesMonthHijriV1;
type SkeletaV1 = DatetimePatternsDateHijriV1;
}

impl FormattableHijriRules for hijri::AstronomicalSimulation {
type YearNamesV1 = DatetimeNamesYearHijriV1;
type MonthNamesV1 = DatetimeNamesMonthHijriV1;
type SkeletaV1 = DatetimePatternsDateHijriV1;
}

impl<R: FormattableHijriRules> CldrCalendar for Hijri<R> {
type YearNamesV1 = R::YearNamesV1;
type MonthNamesV1 = R::MonthNamesV1;
type SkeletaV1 = R::SkeletaV1;
}

impl CldrCalendar for Japanese {
type YearNamesV1 = DatetimeNamesYearJapaneseV1;
type MonthNamesV1 = DatetimeNamesMonthJapaneseV1;
Expand Down
1 change: 1 addition & 0 deletions components/datetime/src/scaffold/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pub use calendar::ConvertCalendar;
pub(crate) use calendar::FormattableAnyCalendar;
pub(crate) use calendar::FormattableAnyCalendarKind;
pub(crate) use calendar::FormattableAnyCalendarNamesLoader;
pub use calendar::FormattableHijriRules;
pub use calendar::FullDataCalMarkers;
pub use calendar::InFixedCalendar;
pub use calendar::InSameCalendar;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,13 @@ use icu_calendar::cal::hijri::Rules;
use icu_calendar::cal::hijri::TabularAlgorithm;
use icu_calendar::cal::hijri::TabularAlgorithmEpoch;
use icu_calendar::cal::hijri::TabularAlgorithmLeapYears;
use icu_calendar::cal::hijri::UmmAlQura;
use icu_calendar::cal::Hijri;
use icu_calendar::types::RataDie;
use icu_calendar::Date;
use icu_datetime::fieldsets;
use icu_datetime::scaffold::FormattableHijriRules;
use icu_datetime::FixedCalendarDateTimeFormatter;

static TEST_RD: [i64; 4] = [727274, 728714, 744313, 764652];

Expand Down Expand Up @@ -102,6 +106,13 @@ impl Rules for IranTestSighting {
}
}

// Use the same display names as for UAQ
impl FormattableHijriRules for IranTestSighting {
type MonthNamesV1 = <UmmAlQura as FormattableHijriRules>::MonthNamesV1;
type YearNamesV1 = <UmmAlQura as FormattableHijriRules>::YearNamesV1;
type SkeletaV1 = <UmmAlQura as FormattableHijriRules>::SkeletaV1;
}

#[test]
fn test_hijri_iran_from_rd() {
let calendar = Hijri(IranTestSighting);
Expand All @@ -123,3 +134,21 @@ fn test_rd_from_hijri_iran() {
assert_eq!(date.to_rata_die(), RataDie::new(*f_date), "{case:?}");
}
}

#[test]
fn test_format() {
let formatter =
FixedCalendarDateTimeFormatter::try_new(Default::default(), fieldsets::YMD::long())
.unwrap();

assert_eq!(
formatter
.format(
&Date::try_new_gregorian(2022, 10, 12)
.unwrap()
.to_calendar(Hijri(IranTestSighting))
)
.to_string(),
"AH 1444 Rabiʻ I 16"
);
}
Loading