0

So I request an URL with ureq lib and then parse the response to an array of enum Response object

let resp = ureq::get(url).call();

let results: Vec<Response> = match resp {
    Ok(response) => response.into_json()?,
    Err(Error::Status(_, response)) => {
        println("Handle defined error");
    }
    Err(_) => {
        // Transport error
        println("Transport error");
    }
};

The problem is response.into_json() could be failed to parse JSON (defined fields not mapping) then I want to handle ? to print some human-readable message. So is any way or chain method to catch it, for example?

let results: Vec<Response> = match resp {
    Ok(response) => response.into_json().got_error_here({
        println("Failed to parse response");
    }),

After research, I now have a few solutions:

match solution

let results: Vec<Response> = match resp {    
    Ok(response) => {
        let resp: Result<_, std::io::Error> = response.into_json();
        match resp {
            Ok(resp) => resp,
            Err(_) => {
                println("Failed to parse response");
            }
        }
    }
}

else solution

let results: Vec<Response> = match resp {    
    Ok(response) => {
        let resp: Result<_, std::io::Error> = response.into_json();
        let Ok(resp) = resp else {
            println("Failed to parse response");
        };
        resp
    }
}

unwrap_or_else solution

let results: Vec<Response> = match resp {    
    Ok(response) => response.into_json().unwrap_or_else(|_| {
        println("Failed to parse response");
    }),
}
Thong Nguyen
  • 143
  • 3
  • 10

1 Answers1

-1

You could use a let-else construct:

  let resp = ureq::get(url).call().expect("error getting response");   
  let Some(results): Vec<Response> = resp.into_json().ok() else {
      println("Failed to parse JSON"); 
        }
opeolluwa
  • 96
  • 8