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");
}),
}