How to avoid map_err?

⚓ Rust    📅 2025-06-01    👤 surdeus    👁️ 4      

surdeus

Warning

This post was published 72 days ago. The information described in this article may have changed.

Info

This post is auto-generated from RSS feed The Rust Programming Language Forum - Latest topics. Source: How to avoid map_err?

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

Read full topic

🏷️ rust_feed