I’ll preface this by saying I’m working my way through the Rust book, too–just a bit further along–so don’t take my word as gospel.
This exact scenario is what the ?
operator was designed for: returning early with the Err
if one is received[1], otherwise unpacking the Ok
. As you’ve discovered, it’s a common pattern, so using the ?
operator greatly cuts down on the boilerplate code. If you wanted to do the equivalent of you have here (panicking instead of returning the Err
for it to potentially be handled in calling code, albeit without your custom panic messages[2]) you could achieve this with unwrap()
instead of ?
:
let html_content_text = reqwest::blocking::get(&permalink).unwrap().text().unwrap();
Both of these will be covered in chapter 9.
If you want to avoid those constructs until later, the only thing I’d say is that some of the intermediate variables seem unnecessary since you can match on the function call directly:
fn get_document(permalink: String) -> Html {
let html_content = match reqwest::blocking::get(&permalink) {
Ok(response) => response,
Err(error) => panic!("There was an error making the request: {:?}", error),
};
let html_content_text = match html_content.text() {
Ok(text) => text,
Err(error) =>
panic!(
"There was an error getting the html text from the content of response: :{:?}",
error
),
};
let document = Html::parse_document(&html_content_text);
document
}
You could also eliminate the final let
statement and just stick the parse_document
call at the end, but that’s a matter of preference–I know having an intermediate variable before a return can sometimes make debugging easier.
As for whether you should build something now or wait till you learn more–go with your gut! The most important thing is that you stay actively engaged with the material, and many people find diving into projects as soon as possible helps them learn and stay motivated. You could also use rustlings and/or Rust by Example as you go through the book, which is what I’ve been doing (specifically rustlings). It’s not as stimulating as writing a project from scratch, but it does let you write some relevant code. And if you’re not already, I highly recommend using the Brown version of the Rust Book which includes interactive quizzes sprinkled throughout. I’ve found them particularly helpful for understanding the quirks of the borrow checker, which is a topic it continues to revist throughout the book.
out-of-order