Skip to content

Commit 6fd71d3

Browse files
committed
Convert NaiveDate::from_isoywd to return Result
1 parent c5cb84a commit 6fd71d3

File tree

4 files changed

+52
-49
lines changed

4 files changed

+52
-49
lines changed

src/format/parsed.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -760,8 +760,8 @@ impl Parsed {
760760

761761
(_, Some(isoyear), &Parsed { isoweek: Some(isoweek), weekday: Some(weekday), .. }) => {
762762
// ISO year, week, day of the week
763-
let date = NaiveDate::from_isoywd(isoyear, isoweek, weekday);
764-
let date = date.ok_or(OUT_OF_RANGE)?;
763+
let date =
764+
NaiveDate::from_isoywd(isoyear, isoweek, weekday).map_err(|_| OUT_OF_RANGE)?;
765765
(verify_ymd(date) && verify_ordinal(date), date)
766766
}
767767

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
//! // July 8 is 188th day of the year 2014 (`o` for "ordinal")
141141
//! assert_eq!(dt, NaiveDate::from_yo(2014, 189).unwrap().and_hms(9, 10, 11).unwrap().and_utc());
142142
//! // July 8 is Tuesday in ISO week 28 of the year 2014.
143-
//! assert_eq!(dt, NaiveDate::from_isoywd(2014, 28, Weekday::Tue)?.and_hms(9, 10, 11).unwrap().and_utc());
143+
//! assert_eq!(dt, NaiveDate::from_isoywd(2014, 28, Weekday::Tue).unwrap().and_hms(9, 10, 11).unwrap().and_utc());
144144
//!
145145
//! let dt = NaiveDate::from_ymd(2014, 7, 8).unwrap().and_hms_milli(9, 10, 11, 12).unwrap().and_local_timezone(Utc).unwrap(); // `2014-07-08T09:10:11.012Z`
146146
//! assert_eq!(dt, NaiveDate::from_ymd(2014, 7, 8).unwrap().and_hms_micro(9, 10, 11, 12_000).unwrap().and_local_timezone(Utc).unwrap());

src/naive/date/mod.rs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -216,55 +216,58 @@ impl NaiveDate {
216216
///
217217
/// # Errors
218218
///
219-
/// Returns `None` if:
220-
/// - The specified week does not exist in that year (for example 2023 week 53).
221-
/// - The value for `week` is invalid (for example: `0`, `60`).
222-
/// - If the resulting date is out of range for `NaiveDate`.
219+
/// This method returns:
220+
/// - [`Error::DoesNotExist`] if specified week does not exist in that year (for example 2023
221+
/// week 53).
222+
/// - [`Error::InvalidArgument`] if the value for `week` is invalid (for example: `0`, `60`).
223+
/// - [`Error::OutOfRange`] if the resulting date is out of range for `NaiveDate`.
223224
///
224225
/// # Example
225226
///
226227
/// ```
227-
/// use chrono::{NaiveDate, Weekday};
228+
/// use chrono::{Error, NaiveDate, Weekday};
228229
///
229230
/// let from_ymd = |y, m, d| NaiveDate::from_ymd(y, m, d).unwrap();
230231
/// let from_isoywd = NaiveDate::from_isoywd;
231232
///
232-
/// assert_eq!(from_isoywd(2015, 0, Weekday::Sun), None);
233-
/// assert_eq!(from_isoywd(2015, 10, Weekday::Sun), Some(from_ymd(2015, 3, 8)));
234-
/// assert_eq!(from_isoywd(2015, 30, Weekday::Mon), Some(from_ymd(2015, 7, 20)));
235-
/// assert_eq!(from_isoywd(2015, 60, Weekday::Mon), None);
233+
/// assert_eq!(from_isoywd(2015, 0, Weekday::Sun), Err(Error::InvalidArgument));
234+
/// assert_eq!(from_isoywd(2015, 10, Weekday::Sun), Ok(from_ymd(2015, 3, 8)));
235+
/// assert_eq!(from_isoywd(2015, 30, Weekday::Mon), Ok(from_ymd(2015, 7, 20)));
236+
/// assert_eq!(from_isoywd(2015, 60, Weekday::Mon), Err(Error::InvalidArgument));
236237
///
237-
/// assert_eq!(from_isoywd(400000, 10, Weekday::Fri), None);
238-
/// assert_eq!(from_isoywd(-400000, 10, Weekday::Sat), None);
238+
/// assert_eq!(from_isoywd(400000, 10, Weekday::Fri), Err(Error::OutOfRange));
239+
/// assert_eq!(from_isoywd(-400000, 10, Weekday::Sat), Err(Error::OutOfRange));
239240
/// ```
240241
///
241242
/// The year number of ISO week date may differ from that of the calendar date.
242243
///
243244
/// ```
244-
/// # use chrono::{NaiveDate, Weekday};
245+
/// # use chrono::{Error, NaiveDate, Weekday};
245246
/// # let from_ymd = |y, m, d| NaiveDate::from_ymd(y, m, d).unwrap();
246247
/// # let from_isoywd = NaiveDate::from_isoywd;
247248
/// // Mo Tu We Th Fr Sa Su
248249
/// // 2014-W52 22 23 24 25 26 27 28 has 4+ days of new year,
249250
/// // 2015-W01 29 30 31 1 2 3 4 <- so this is the first week
250-
/// assert_eq!(from_isoywd(2014, 52, Weekday::Sun), Some(from_ymd(2014, 12, 28)));
251-
/// assert_eq!(from_isoywd(2014, 53, Weekday::Mon), None);
252-
/// assert_eq!(from_isoywd(2015, 1, Weekday::Mon), Some(from_ymd(2014, 12, 29)));
251+
/// assert_eq!(from_isoywd(2014, 52, Weekday::Sun), Ok(from_ymd(2014, 12, 28)));
252+
/// assert_eq!(from_isoywd(2014, 53, Weekday::Mon), Err(Error::DoesNotExist));
253+
/// assert_eq!(from_isoywd(2015, 1, Weekday::Mon), Ok(from_ymd(2014, 12, 29)));
253254
///
254255
/// // 2015-W52 21 22 23 24 25 26 27 has 4+ days of old year,
255256
/// // 2015-W53 28 29 30 31 1 2 3 <- so this is the last week
256257
/// // 2016-W01 4 5 6 7 8 9 10
257-
/// assert_eq!(from_isoywd(2015, 52, Weekday::Sun), Some(from_ymd(2015, 12, 27)));
258-
/// assert_eq!(from_isoywd(2015, 53, Weekday::Sun), Some(from_ymd(2016, 1, 3)));
259-
/// assert_eq!(from_isoywd(2015, 54, Weekday::Mon), None);
260-
/// assert_eq!(from_isoywd(2016, 1, Weekday::Mon), Some(from_ymd(2016, 1, 4)));
258+
/// assert_eq!(from_isoywd(2015, 52, Weekday::Sun), Ok(from_ymd(2015, 12, 27)));
259+
/// assert_eq!(from_isoywd(2015, 53, Weekday::Sun), Ok(from_ymd(2016, 1, 3)));
260+
/// assert_eq!(from_isoywd(2015, 54, Weekday::Mon), Err(Error::InvalidArgument));
261+
/// assert_eq!(from_isoywd(2016, 1, Weekday::Mon), Ok(from_ymd(2016, 1, 4)));
261262
/// ```
262-
#[must_use]
263-
pub const fn from_isoywd(year: i32, week: u32, weekday: Weekday) -> Option<NaiveDate> {
263+
pub const fn from_isoywd(year: i32, week: u32, weekday: Weekday) -> Result<NaiveDate, Error> {
264264
let flags = YearFlags::from_year(year);
265265
let nweeks = flags.nisoweeks();
266266
if week == 0 || week > nweeks {
267-
return None;
267+
return Err(match week == 0 || week > 53 {
268+
true => Error::InvalidArgument,
269+
false => Error::DoesNotExist,
270+
});
268271
}
269272
// ordinal = week ordinal - delta
270273
let weekord = week * 7 + weekday as u32;
@@ -285,7 +288,7 @@ impl NaiveDate {
285288
(year + 1, ordinal - ndays, nextflags)
286289
}
287290
};
288-
ok!(NaiveDate::from_ordinal_and_flags(year, ordinal, flags))
291+
NaiveDate::from_ordinal_and_flags(year, ordinal, flags)
289292
}
290293

291294
/// Makes a new `NaiveDate` from a day's number in the proleptic Gregorian calendar, with

src/naive/date/tests.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -201,28 +201,28 @@ fn test_date_from_isoywd() {
201201
let from_isoywd = NaiveDate::from_isoywd;
202202
let ymd = |y, m, d| NaiveDate::from_ymd(y, m, d).unwrap();
203203

204-
assert_eq!(from_isoywd(2004, 0, Weekday::Sun), None);
205-
assert_eq!(from_isoywd(2004, 1, Weekday::Mon), Some(ymd(2003, 12, 29)));
206-
assert_eq!(from_isoywd(2004, 1, Weekday::Sun), Some(ymd(2004, 1, 4)));
207-
assert_eq!(from_isoywd(2004, 2, Weekday::Mon), Some(ymd(2004, 1, 5)));
208-
assert_eq!(from_isoywd(2004, 2, Weekday::Sun), Some(ymd(2004, 1, 11)));
209-
assert_eq!(from_isoywd(2004, 52, Weekday::Mon), Some(ymd(2004, 12, 20)));
210-
assert_eq!(from_isoywd(2004, 52, Weekday::Sun), Some(ymd(2004, 12, 26)));
211-
assert_eq!(from_isoywd(2004, 53, Weekday::Mon), Some(ymd(2004, 12, 27)));
212-
assert_eq!(from_isoywd(2004, 53, Weekday::Sun), Some(ymd(2005, 1, 2)));
213-
assert_eq!(from_isoywd(2004, 54, Weekday::Mon), None);
214-
215-
assert_eq!(from_isoywd(2011, 0, Weekday::Sun), None);
216-
assert_eq!(from_isoywd(2011, 1, Weekday::Mon), Some(ymd(2011, 1, 3)));
217-
assert_eq!(from_isoywd(2011, 1, Weekday::Sun), Some(ymd(2011, 1, 9)));
218-
assert_eq!(from_isoywd(2011, 2, Weekday::Mon), Some(ymd(2011, 1, 10)));
219-
assert_eq!(from_isoywd(2011, 2, Weekday::Sun), Some(ymd(2011, 1, 16)));
220-
221-
assert_eq!(from_isoywd(2018, 51, Weekday::Mon), Some(ymd(2018, 12, 17)));
222-
assert_eq!(from_isoywd(2018, 51, Weekday::Sun), Some(ymd(2018, 12, 23)));
223-
assert_eq!(from_isoywd(2018, 52, Weekday::Mon), Some(ymd(2018, 12, 24)));
224-
assert_eq!(from_isoywd(2018, 52, Weekday::Sun), Some(ymd(2018, 12, 30)));
225-
assert_eq!(from_isoywd(2018, 53, Weekday::Mon), None);
204+
assert_eq!(from_isoywd(2004, 0, Weekday::Sun), Err(Error::InvalidArgument));
205+
assert_eq!(from_isoywd(2004, 1, Weekday::Mon), Ok(ymd(2003, 12, 29)));
206+
assert_eq!(from_isoywd(2004, 1, Weekday::Sun), Ok(ymd(2004, 1, 4)));
207+
assert_eq!(from_isoywd(2004, 2, Weekday::Mon), Ok(ymd(2004, 1, 5)));
208+
assert_eq!(from_isoywd(2004, 2, Weekday::Sun), Ok(ymd(2004, 1, 11)));
209+
assert_eq!(from_isoywd(2004, 52, Weekday::Mon), Ok(ymd(2004, 12, 20)));
210+
assert_eq!(from_isoywd(2004, 52, Weekday::Sun), Ok(ymd(2004, 12, 26)));
211+
assert_eq!(from_isoywd(2004, 53, Weekday::Mon), Ok(ymd(2004, 12, 27)));
212+
assert_eq!(from_isoywd(2004, 53, Weekday::Sun), Ok(ymd(2005, 1, 2)));
213+
assert_eq!(from_isoywd(2004, 54, Weekday::Mon), Err(Error::InvalidArgument));
214+
215+
assert_eq!(from_isoywd(2011, 0, Weekday::Sun), Err(Error::InvalidArgument));
216+
assert_eq!(from_isoywd(2011, 1, Weekday::Mon), Ok(ymd(2011, 1, 3)));
217+
assert_eq!(from_isoywd(2011, 1, Weekday::Sun), Ok(ymd(2011, 1, 9)));
218+
assert_eq!(from_isoywd(2011, 2, Weekday::Mon), Ok(ymd(2011, 1, 10)));
219+
assert_eq!(from_isoywd(2011, 2, Weekday::Sun), Ok(ymd(2011, 1, 16)));
220+
221+
assert_eq!(from_isoywd(2018, 51, Weekday::Mon), Ok(ymd(2018, 12, 17)));
222+
assert_eq!(from_isoywd(2018, 51, Weekday::Sun), Ok(ymd(2018, 12, 23)));
223+
assert_eq!(from_isoywd(2018, 52, Weekday::Mon), Ok(ymd(2018, 12, 24)));
224+
assert_eq!(from_isoywd(2018, 52, Weekday::Sun), Ok(ymd(2018, 12, 30)));
225+
assert_eq!(from_isoywd(2018, 53, Weekday::Mon), Err(Error::DoesNotExist));
226226
}
227227

228228
#[test]
@@ -241,7 +241,7 @@ fn test_date_from_isoywd_and_iso_week() {
241241
.iter()
242242
{
243243
let d = NaiveDate::from_isoywd(year, week, weekday);
244-
if let Some(d) = d {
244+
if let Ok(d) = d {
245245
assert_eq!(d.weekday(), weekday);
246246
let w = d.iso_week();
247247
assert_eq!(w.year(), year);

0 commit comments

Comments
 (0)