Warning
This post was published 72 days ago. The information described in this article may have changed.
I have the following code,
fn parse_web_date(str: &str) -> Result<u64, std::num::ParseIntError> {
let fmt_err = "".parse::<u32>().expect_err("invalid format {str}");
let (_,date) = str.split_once(", ").ok_or(fmt_err.clone())?;
let mut parts = date.split(' ');
let Some(day) = parts.next() else {
return Err(fmt_err)
} ;
let day = day.parse::<u32>()?;
let Some(month) = parts.next() else {
return Err(fmt_err)
} ;
let month:u32 = match month {
"Jan" => 1,
"Feb" => 2,
"Mar" => 3,
"Apr" => 4,
"May" => 5,
"Jun" => 6,
"Jul" => 7,
"Aug" => 8,
"Sep" => 9,
"Oct" => 10,
"Nov" => 11,
"Dec" => 12,
_ => return Err(fmt_err)
};
let Some(year) = parts.next() else {
return Err(fmt_err)
} ;
let year = year.parse::<u32>()?;
let Some(time) = parts.next() else {
return Err(fmt_err)
} ;
let [h,m,s] = *time.splitn(3,':').collect::<Vec<_>>() else { todo!() };
let h = h.parse::<u64>()?;
let m = m.parse::<u64>()?;
let s = s.parse::<u64>()?;
Ok(seconds_from_epoch(year,month,day)+h*60*60+m*60+s)
}
It looks a quite ugly because the fist line. But this error type I can't create other way. Rust is not OO language, so there is no general parse error. So how to manage the situation without introducing tons of map_err calls?
3 posts - 2 participants
🏷️ rust_feed