Skip to content

Commit

Permalink
Make parsing %:z conform to documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
pitdicker committed Jun 30, 2023
1 parent a8d9a5d commit d95caa7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 deletions.
1 change: 0 additions & 1 deletion src/format/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,6 @@ pub enum Fixed {
TimezoneName,
/// Offset from the local time to UTC (`+09:00` or `-04:00` or `+00:00`).
///
/// In the parser, the colon can be omitted and/or surrounded with any amount of whitespace.
/// The offset is limited from `-24:00` to `+24:00`,
/// which is the same as [`FixedOffset`](../offset/struct.FixedOffset.html)'s range.
TimezoneOffsetColon,
Expand Down
38 changes: 23 additions & 15 deletions src/format/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -516,14 +516,22 @@ where
try_consume!(Ok((s.trim_start_matches(|c: char| !c.is_whitespace()), ())));
}

&TimezoneOffsetColon
| &TimezoneOffset
| &TimezoneOffsetColonZ
| &TimezoneOffsetZ => {
&TimezoneOffset | &TimezoneOffsetZ => {
let offset_format = OffsetFormat {
precision: OffsetPrecision::Minutes,
colons: Colons::Maybe,
allow_zulu: spec == &TimezoneOffsetColonZ || spec == &TimezoneOffsetZ,
allow_zulu: spec == &TimezoneOffsetZ,
padding: Pad::Zero,
};
let offset = try_consume!(scan::utc_offset(s.trim_start(), offset_format));
parsed.set_offset(i64::from(offset)).map_err(|e| (s, e))?;
}

&TimezoneOffsetColon | &TimezoneOffsetColonZ => {
let offset_format = OffsetFormat {
precision: OffsetPrecision::Minutes,
colons: Colons::Colon,
allow_zulu: spec == &TimezoneOffsetColonZ,
padding: Pad::Zero,
};
let offset = try_consume!(scan::utc_offset(s.trim_start(), offset_format));
Expand Down Expand Up @@ -990,14 +998,14 @@ mod tests {
check!("12345678", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+1", [fixed(Fixed::TimezoneOffsetColon)]; TOO_SHORT);
check!("+12", [fixed(Fixed::TimezoneOffsetColon)]; TOO_SHORT);
check!("+123", [fixed(Fixed::TimezoneOffsetColon)]; TOO_SHORT);
check!("+1234", [fixed(Fixed::TimezoneOffsetColon)]; offset: 45_240);
check!("-1234", [fixed(Fixed::TimezoneOffsetColon)]; offset: -45_240);
check!("−1234", [fixed(Fixed::TimezoneOffsetColon)]; offset: -45_240); // MINUS SIGN (U+2212)
check!("+12345", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+123456", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+1234567", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+12345678", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+123", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+1234", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("-1234", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("−1234", [fixed(Fixed::TimezoneOffsetColon)]; INVALID); // MINUS SIGN (U+2212)
check!("+12345", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+123456", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+1234567", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+12345678", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("1:", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("12:", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("12:3", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
Expand All @@ -1018,7 +1026,7 @@ mod tests {
check!("+12:34:56:7", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+12:34:56:78", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+12:3456", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+1234:56", [fixed(Fixed::TimezoneOffsetColon)]; TOO_LONG);
check!("+1234:56", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("−12:34", [fixed(Fixed::TimezoneOffsetColon)]; offset: -45_240); // MINUS SIGN (U+2212)
check!("−12 : 34", [fixed(Fixed::TimezoneOffsetColon)]; INVALID); // MINUS SIGN (U+2212)
check!("+12 :34", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
Expand Down Expand Up @@ -1047,7 +1055,7 @@ mod tests {
check!("", [fixed(Fixed::TimezoneOffsetColon)]; TOO_SHORT);
check!("+", [fixed(Fixed::TimezoneOffsetColon)]; TOO_SHORT);
check!(":", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
check!("+12345", [fixed(Fixed::TimezoneOffsetColon), num(Day)]; offset: 45_240, day: 5);
check!("+12345", [fixed(Fixed::TimezoneOffsetColon), num(Day)]; INVALID);
check!("+12:345", [fixed(Fixed::TimezoneOffsetColon), num(Day)]; offset: 45_240, day: 5);
check!("+12:34:", [fixed(Fixed::TimezoneOffsetColon), Literal(":")]; offset: 45_240);
check!("Z", [fixed(Fixed::TimezoneOffsetColon)]; INVALID);
Expand Down

0 comments on commit d95caa7

Please sign in to comment.