patternrustCritical
Is there a way to simplify converting an Option into a Result without a macro?
Viewed 0 times
convertingmacrooptionresultwaywithoutintotheresimplify
Problem
I have something like this (the real function is
I have to call it several times:
To remove code bloat, I can write a macro like this:
Is there any way to remove the code duplication without this macro implementation?
Ini::Section::get from rust-ini):impl Foo {
pub fn get(&'a mut self, key: &K) -> Option
where
K: Hash + Eq,
{
// ...
}
}I have to call it several times:
fn new() -> Result {
let item1 = match section.get("item1") {
None => return Result::Err("no item1".to_string()),
Some(v) => v,
};
let item2 = match section.get("item2") {
None => return Result::Err("no item2".to_string()),
Some(v) => v,
};
}To remove code bloat, I can write a macro like this:
macro_rules! try_ini_get {
($e:expr) => {
match $e {
Some(s) => Ok(s),
None => Err("no ini item".to_string()),
}
}
}Is there any way to remove the code duplication without this macro implementation?
Solution
The
You could do something like:
ok_or and ok_or_else methods convert Options to Results, and the ? operator automates the boilerplate associated with early Err returns. You could do something like:
fn new() -> Result {
let item1 = section.get("item1").ok_or("no item1")?;
let item2 = section.get("item2").ok_or("no item2")?;
// whatever processing...
Ok(final_result)
}Code Snippets
fn new() -> Result<Boo, String> {
let item1 = section.get("item1").ok_or("no item1")?;
let item2 = section.get("item2").ok_or("no item2")?;
// whatever processing...
Ok(final_result)
}Context
Stack Overflow Q#37890405, score: 219
Revisions (0)
No revisions yet.