Skip to content

Commit

Permalink
Merge branch 'main' into collation
Browse files Browse the repository at this point in the history
  • Loading branch information
hsivonen committed May 18, 2022
2 parents 8931e5f + 1459779 commit 2d4b5d6
Show file tree
Hide file tree
Showing 125 changed files with 14,767 additions and 537 deletions.
13 changes: 4 additions & 9 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions components/calendar/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,5 @@ zerovec = { version = "0.7", path = "../../utils/zerovec", default-features = fa

[dev-dependencies]
icu = { path = "../icu", default-features = false }
icu_calendar = { version = "0.6", path = "../calendar", features = ["serde"] }
icu_testdata = { version = "0.6", path = "../../provider/testdata" }
18 changes: 13 additions & 5 deletions components/calendar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ use icu_calendar::{Date,
types::IsoWeekday};

// Creating ISO date: 1992-09-02.
let mut date_iso = Date::new_iso_date_from_integers(1992, 9, 2).unwrap();
let mut date_iso = Date::new_iso_date_from_integers(1992, 9, 2)
.expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.day_of_week(), IsoWeekday::Wednesday);
assert_eq!(date_iso.year().number, 1992);
assert_eq!(date_iso.month().number, 9);
Expand All @@ -51,7 +53,8 @@ assert_eq!(date_iso.month().number, 9);
assert_eq!(date_iso.day_of_month().0, 2);

// Creating ISO date: 2022-01-30.
let newer_date_iso = Date::new_iso_date_from_integers(2022, 1, 30).unwrap();
let newer_date_iso = Date::new_iso_date_from_integers(2022, 1, 30)
.expect("Failed to initialize ISO Date instance.");

// Comparing dates: 2022-01-30 and 1992-09-02.
let duration = newer_date_iso.until(&date_iso, DateDurationUnit::Years, DateDurationUnit::Days);
Expand All @@ -74,7 +77,9 @@ use icu_calendar::{Date,
indian::Indian};

// Creating ISO date: 1992-09-02.
let mut date_iso = Date::new_iso_date_from_integers(1992, 9, 2).unwrap();
let mut date_iso = Date::new_iso_date_from_integers(1992, 9, 2)
.expect("Failed to initialize ISO Date instance.");

assert_eq!(date_iso.year().number, 1992);
assert_eq!(date_iso.month().number, 9);
assert_eq!(date_iso.day_of_month().0, 2);
Expand Down Expand Up @@ -108,7 +113,9 @@ use icu_calendar::{DateTime,
types::Time};

// Creating ISO date: 1992-09-02 8:59
let mut datetime_iso = DateTime::new_iso_datetime_from_integers(1992, 9, 2, 8, 59, 0).unwrap();
let mut datetime_iso = DateTime::new_iso_datetime_from_integers(1992, 9, 2, 8, 59, 0)
.expect("Failed to initialize ISO DateTime instance.");

assert_eq!(datetime_iso.date.day_of_week(), IsoWeekday::Wednesday);
assert_eq!(datetime_iso.date.year().number, 1992);
assert_eq!(datetime_iso.date.month().number, 9);
Expand All @@ -121,7 +128,8 @@ assert_eq!(datetime_iso.time.nanosecond, NanoSecond::new_unchecked(0));
// Advancing date by 1 year, 2 months, 3 weeks, 4 days.
datetime_iso.date.add(DateDuration::new(1, 2, 3, 4));
// New time of 14:30
datetime_iso.time = Time::try_new(14, 30, 0, 0).unwrap();
datetime_iso.time = Time::try_new(14, 30, 0, 0)
.expect("Failed to initialize Time instance.");

assert_eq!(datetime_iso.date.year().number, 1993);
assert_eq!(datetime_iso.date.month().number, 11);
Expand Down
31 changes: 31 additions & 0 deletions components/calendar/src/any_calendar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use crate::buddhist::Buddhist;
use crate::coptic::Coptic;
use crate::ethiopic::Ethiopic;
use crate::gregorian::Gregorian;
use crate::indian::Indian;
use crate::iso::Iso;
Expand Down Expand Up @@ -33,6 +34,7 @@ pub enum AnyCalendar {
Gregorian(Gregorian),
Buddhist(Buddhist),
Japanese(Japanese),
Ethiopic(Ethiopic),
Indian(Indian),
Coptic(Coptic),
Iso(Iso),
Expand All @@ -45,6 +47,7 @@ pub enum AnyDateInner {
Gregorian(<Gregorian as Calendar>::DateInner),
Buddhist(<Buddhist as Calendar>::DateInner),
Japanese(<Japanese as Calendar>::DateInner),
Ethiopic(<Ethiopic as Calendar>::DateInner),
Indian(<Indian as Calendar>::DateInner),
Coptic(<Coptic as Calendar>::DateInner),
Iso(<Iso as Calendar>::DateInner),
Expand All @@ -56,6 +59,7 @@ macro_rules! match_cal_and_date {
(&Self::Gregorian(ref $cal_matched), &AnyDateInner::Gregorian(ref $date_matched)) => $e,
(&Self::Buddhist(ref $cal_matched), &AnyDateInner::Buddhist(ref $date_matched)) => $e,
(&Self::Japanese(ref $cal_matched), &AnyDateInner::Japanese(ref $date_matched)) => $e,
(&Self::Ethiopic(ref $cal_matched), &AnyDateInner::Ethiopic(ref $date_matched)) => $e,
(&Self::Indian(ref $cal_matched), &AnyDateInner::Indian(ref $date_matched)) => $e,
(&Self::Coptic(ref $cal_matched), &AnyDateInner::Coptic(ref $date_matched)) => $e,
(&Self::Iso(ref $cal_matched), &AnyDateInner::Iso(ref $date_matched)) => $e,
Expand All @@ -75,6 +79,7 @@ impl Calendar for AnyCalendar {
Self::Gregorian(ref c) => AnyDateInner::Gregorian(c.date_from_iso(iso)),
Self::Buddhist(ref c) => AnyDateInner::Buddhist(c.date_from_iso(iso)),
Self::Japanese(ref c) => AnyDateInner::Japanese(c.date_from_iso(iso)),
Self::Ethiopic(ref c) => AnyDateInner::Ethiopic(c.date_from_iso(iso)),
Self::Indian(ref c) => AnyDateInner::Indian(c.date_from_iso(iso)),
Self::Coptic(ref c) => AnyDateInner::Coptic(c.date_from_iso(iso)),
Self::Iso(ref c) => AnyDateInner::Iso(c.date_from_iso(iso)),
Expand Down Expand Up @@ -108,6 +113,9 @@ impl Calendar for AnyCalendar {
(&Self::Japanese(ref c), &mut AnyDateInner::Japanese(ref mut d)) => {
c.offset_date(d, offset.cast_unit())
}
(&Self::Ethiopic(ref c), &mut AnyDateInner::Ethiopic(ref mut d)) => {
c.offset_date(d, offset.cast_unit())
}
(&Self::Indian(ref c), &mut AnyDateInner::Indian(ref mut d)) => {
c.offset_date(d, offset.cast_unit())
}
Expand Down Expand Up @@ -160,6 +168,14 @@ impl Calendar for AnyCalendar {
) => c1
.until(d1, d2, c2, largest_unit, smallest_unit)
.cast_unit(),
(
&Self::Ethiopic(ref c1),
&Self::Ethiopic(ref c2),
&AnyDateInner::Ethiopic(ref d1),
&AnyDateInner::Ethiopic(ref d2),
) => c1
.until(d1, d2, c2, largest_unit, smallest_unit)
.cast_unit(),
(
&Self::Indian(ref c1),
&Self::Indian(ref c2),
Expand Down Expand Up @@ -224,6 +240,7 @@ impl Calendar for AnyCalendar {
Self::Gregorian(_) => "AnyCalendar (Gregorian)",
Self::Buddhist(_) => "AnyCalendar (Buddhist)",
Self::Japanese(_) => "AnyCalendar (Japanese)",
Self::Ethiopic(_) => "AnyCalendar (Ethiopic)",
Self::Indian(_) => "AnyCalendar (Indian)",
Self::Coptic(_) => "AnyCalendar (Coptic)",
Self::Iso(_) => "AnyCalendar (Iso)",
Expand Down Expand Up @@ -308,6 +325,7 @@ impl AnyCalendar {
Self::Gregorian(_) => "Gregorian",
Self::Buddhist(_) => "Buddhist",
Self::Japanese(_) => "Japanese",
Self::Ethiopic(_) => "Ethiopic",
Self::Indian(_) => "Indian",
Self::Coptic(_) => "Coptic",
Self::Iso(_) => "Iso",
Expand All @@ -321,6 +339,7 @@ impl AnyDateInner {
AnyDateInner::Gregorian(_) => "Gregorian",
AnyDateInner::Buddhist(_) => "Buddhist",
AnyDateInner::Japanese(_) => "Japanese",
AnyDateInner::Ethiopic(_) => "Ethiopic",
AnyDateInner::Indian(_) => "Indian",
AnyDateInner::Coptic(_) => "Coptic",
AnyDateInner::Iso(_) => "Iso",
Expand Down Expand Up @@ -447,6 +466,18 @@ impl IncludedInAnyCalendar for Japanese {
}
}

impl IncludedInAnyCalendar for Ethiopic {
fn to_any(self) -> AnyCalendar {
AnyCalendar::Ethiopic(self)
}
fn to_any_cloned(&self) -> AnyCalendar {
AnyCalendar::Ethiopic(Ethiopic)
}
fn date_to_any(d: &Self::DateInner) -> AnyDateInner {
AnyDateInner::Ethiopic(*d)
}
}

impl IncludedInAnyCalendar for Indian {
fn to_any(self) -> AnyCalendar {
AnyCalendar::Indian(Indian)
Expand Down
12 changes: 8 additions & 4 deletions components/calendar/src/buddhist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
//! buddhist::Buddhist};
//!
//! // `Date` type
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2).unwrap();
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2)
//! .expect("Failed to initialize ISO Date instance.");
//! let date_buddhist = Date::new_from_iso(date_iso, Buddhist);
//!
//! // `DateTime` type
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0).unwrap();
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0)
//! .expect("Failed to initialize ISO DateTime instance.");
//! let datetime_buddhist = DateTime::new_from_iso(datetime_iso, Buddhist);
//!
//! // `Date` checks
Expand Down Expand Up @@ -131,7 +133,8 @@ impl Date<Buddhist> {
/// use icu::calendar::Date;
/// use std::convert::TryFrom;
///
/// let date_buddhist = Date::new_buddhist_date(1970, 1, 2).unwrap();
/// let date_buddhist = Date::new_buddhist_date(1970, 1, 2)
/// .expect("Failed to initialize Buddhist Date instance.");
///
/// assert_eq!(date_buddhist.year().number, 1970);
/// assert_eq!(date_buddhist.month().number, 1);
Expand All @@ -158,7 +161,8 @@ impl DateTime<Buddhist> {
/// types::IsoMinute,
/// types::IsoSecond};
///
/// let datetime_buddhist = DateTime::new_buddhist_datetime(1970, 1, 2, 13, 1, 0).unwrap();
/// let datetime_buddhist = DateTime::new_buddhist_datetime(1970, 1, 2, 13, 1, 0)
/// .expect("Failed to initialize Buddhist DateTime instance.");
///
/// assert_eq!(datetime_buddhist.date.year().number, 1970);
/// assert_eq!(datetime_buddhist.date.month().number, 1);
Expand Down
12 changes: 8 additions & 4 deletions components/calendar/src/coptic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
//! coptic::Coptic};
//!
//! // `Date` type
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2).unwrap();
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2)
//! .expect("Failed to initialize ISO Date instance.");
//! let date_coptic = Date::new_from_iso(date_iso, Coptic);
//!
//! // `DateTime` type
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0).unwrap();
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0)
//! .expect("Failed to initialize ISO DateTime instance.");
//! let datetime_coptic = DateTime::new_from_iso(datetime_iso, Coptic);
//!
//! // `Date` checks
Expand Down Expand Up @@ -202,7 +204,8 @@ impl Date<Coptic> {
/// ```rust
/// use icu::calendar::Date;
///
/// let date_coptic = Date::new_coptic_date(1686, 5, 6).unwrap();
/// let date_coptic = Date::new_coptic_date(1686, 5, 6)
/// .expect("Failed to initialize Coptic Date instance.");
///
/// assert_eq!(date_coptic.year().number, 1686);
/// assert_eq!(date_coptic.month().number, 5);
Expand Down Expand Up @@ -234,7 +237,8 @@ impl DateTime<Coptic> {
/// types::IsoMinute,
/// types::IsoSecond};
///
/// let datetime_coptic = DateTime::new_coptic_datetime(1686, 5, 6, 13, 1, 0).unwrap();
/// let datetime_coptic = DateTime::new_coptic_datetime(1686, 5, 6, 13, 1, 0)
/// .expect("Failed to initialize Coptic DateTime instance.");
///
/// assert_eq!(datetime_coptic.date.year().number, 1686);
/// assert_eq!(datetime_coptic.date.month().number, 5);
Expand Down
27 changes: 23 additions & 4 deletions components/calendar/src/ethiopic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
//! ethiopic::Ethiopic};
//!
//! // `Date` type
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2).unwrap();
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2)
//! .expect("Failed to initialize ISO Date instance.");
//! let date_ethiopic = Date::new_from_iso(date_iso, Ethiopic);
//!
//! // `DateTime` type
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0).unwrap();
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0)
//! .expect("Failed to initialize ISO DateTime instance.");
//! let datetime_ethiopic = DateTime::new_from_iso(datetime_iso, Ethiopic);
//!
//! // `Date` checks
Expand Down Expand Up @@ -216,7 +218,8 @@ impl Date<Ethiopic> {
/// ```rust
/// use icu::calendar::Date;
///
/// let date_ethiopic = Date::new_ethiopic_date(2014, 8, 25).unwrap();
/// let date_ethiopic = Date::new_ethiopic_date(2014, 8, 25)
/// .expect("Failed to initialize Ethopic Date instance.");
///
/// assert_eq!(date_ethiopic.year().number, 2014);
/// assert_eq!(date_ethiopic.month().number, 8);
Expand Down Expand Up @@ -256,7 +259,8 @@ impl DateTime<Ethiopic> {
/// types::IsoMinute,
/// types::IsoSecond};
///
/// let datetime_ethiopic = DateTime::new_ethiopic_datetime(2014, 8, 25, 13, 1, 0, 0).unwrap();
/// let datetime_ethiopic = DateTime::new_ethiopic_datetime(2014, 8, 25, 13, 1, 0, 0)
/// .expect("Failed to initialize Ethiopic DateTime instance.");
///
/// assert_eq!(datetime_ethiopic.date.year().number, 2014);
/// assert_eq!(datetime_ethiopic.date.month().number, 8);
Expand Down Expand Up @@ -298,4 +302,19 @@ mod test {
assert_eq!(ethiopic_date.0.month, 13);
assert_eq!(ethiopic_date.0.day, 6);
}

#[test]
fn test_iso_to_ethiopic_conversion_and_back() {
let iso_date = Date::new_iso_date_from_integers(1970, 1, 2).unwrap();
let date_ethiopic = Date::new_from_iso(iso_date, Ethiopic);

assert_eq!(date_ethiopic.inner.0.year, 1962);
assert_eq!(date_ethiopic.inner.0.month, 4);
assert_eq!(date_ethiopic.inner.0.day, 24);

assert_eq!(
date_ethiopic.to_iso(),
Date::new_iso_date_from_integers(1970, 1, 2).unwrap()
);
}
}
18 changes: 12 additions & 6 deletions components/calendar/src/gregorian.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
//! gregorian::Gregorian};
//!
//! // `Date` type
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2).unwrap();
//! let date_iso = Date::new_iso_date_from_integers(1970, 1, 2)
//! .expect("Failed to initialize ISO Date instance.");
//! let date_gregorian = Date::new_from_iso(date_iso, Gregorian);
//!
//! // `DateTime` type
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0).unwrap();
//! let datetime_iso = DateTime::new_iso_datetime_from_integers(1970, 1, 2, 13, 1, 0)
//! .expect("Failed to initialize ISO DateTime instance.");
//! let datetime_gregorian = DateTime::new_from_iso(datetime_iso, Gregorian);
//!
//! // `Date` checks
Expand Down Expand Up @@ -130,11 +132,14 @@ impl Date<Gregorian> {
/// use std::convert::TryFrom;
///
/// let iso_year = IsoYear(1970);
/// let iso_month = IsoMonth::try_from(1).unwrap();
/// let iso_day = IsoDay::try_from(2).unwrap();
/// let iso_month = IsoMonth::try_from(1)
/// .expect("Failed to initialize IsoMonth instance.");
/// let iso_day = IsoDay::try_from(2)
/// .expect("Failed to initialize IsoDay instance.");
///
/// // Conversion from ISO to Gregorian
/// let date_gregorian = Date::new_gregorian_date(iso_year, iso_month, iso_day).unwrap();
/// let date_gregorian = Date::new_gregorian_date(iso_year, iso_month, iso_day)
/// .expect("Failed to initialize Gregorian Date instance.");
///
/// assert_eq!(date_gregorian.year().number, 1970);
/// assert_eq!(date_gregorian.month().number, 1);
Expand All @@ -160,7 +165,8 @@ impl DateTime<Gregorian> {
/// types::IsoMinute,
/// types::IsoSecond};
///
/// let datetime_gregorian = DateTime::new_gregorian_datetime_from_integers(1970, 1, 2, 13, 1, 0, 0).unwrap();
/// let datetime_gregorian = DateTime::new_gregorian_datetime_from_integers(1970, 1, 2, 13, 1, 0, 0)
/// .expect("Failed to initialize Gregorian DateTime instance.");
///
/// assert_eq!(datetime_gregorian.date.year().number, 1970);
/// assert_eq!(datetime_gregorian.date.month().number, 1);
Expand Down
Loading

0 comments on commit 2d4b5d6

Please sign in to comment.