diff --git a/src/time/parser.rs b/src/time/parser.rs index e4aa362..7faed83 100644 --- a/src/time/parser.rs +++ b/src/time/parser.rs @@ -70,7 +70,13 @@ impl<'a> Parser<'a> { Format::Extended => self.text.get(5..7), }; if let Some(m) = month { - let month = m.parse()?; + let month = match m.parse() { + Ok(m) => m, + Err(_) => { + self.mode = Mode::TimeZone; + return Ok(()); + } + }; if month > 12 { return Err(Error::InvalidMonth); } @@ -89,7 +95,13 @@ impl<'a> Parser<'a> { Format::Extended => self.text.get(8..10), }; if let Some(d) = day { - let day = d.parse()?; + let day = match d.parse() { + Ok(d) => d, + Err(_) => { + self.mode = Mode::TimeZone; + return Ok(()); + } + }; let max = match self.month { Some(1|3|5|7|10|12) => 31, Some(2) => { @@ -127,21 +139,69 @@ impl<'a> Parser<'a> { fn parse_hour(&mut self) -> Result<(), Error> { assert_eq!(self.mode, Mode::Hour); - todo!() + let hour = match self.format { + Format::Basic => self.text.get(9..11), + Format::Extended => self.text.get(11..13), + }; + if let Some(h) = hour { + let hour = match h.parse() { + Ok(h) => h, + Err(_) => { + self.mode = Mode::TimeZone; + return Ok(()); + } + }; + if hour > 24 { + return Err(Error::InvalidHour); + } + self.hour = Some(hour); + self.mode = Mode::Minute; + } else { + self.mode = Mode::TimeZone; + } + Ok(()) } fn parse_minute(&mut self) -> Result<(), Error> { assert_eq!(self.mode, Mode::Minute); - todo!() + let minute = match self.format { + Format::Basic => self.text.get(11..13), + Format::Extended => self.text.get(14..16), + }; + if let Some(m) = minute { + let minute = match m.parse() { + Ok(m) => m, + Err(_) => { + self.mode = Mode::TimeZone; + return Ok(()); + } + }; + if minute > 60 { + return Err(Error::InvalidMinute); + } + self.minute = Some(minute); + self.mode = Mode::Second; + } else { + self.mode = Mode::TimeZone; + } + Ok(()) } fn parse_second(&mut self) -> Result<(), Error> { assert_eq!(self.mode, Mode::Second); + let second = match self.format { + Format::Basic => self.text.get(13..15), + Format::Extended => self.text.get(17..19), + }; todo!() } fn parse_timezone(&mut self) -> Result<(), Error> { assert_eq!(self.mode, Mode::TimeZone); + let tz = match self.format { + Format::Basic => self.text.get(15..), + Format::Extended => self.text.get(19..), + }; todo!() }