If we introduce Ok
wrapping in try
blocks it’s reasonable to make this wrapping mandatory and to cover only one level of wrapping, i.e. this code will result in a compilation errors:
try fn foo() -> Result<u32, E> {
Ok(1u32)
}
try fn foo2() -> Result<u32, E> {
Err(e)
}
try fn bar() -> Option<Option<u32>> {
1u32
}
At first it could look a bit strange, but without this strict rule it will be much harder to reason about code behaviour. Thus you example will look like this:
try fn foo() -> Result<Result<u32, E1>, E2> {
// returns Err(e1)
if a { throw e1; }
// returns Ok(Err(e2))
if b { return Err(e2); }
// returns Ok(Ok(1u32))
Ok(1u32)
// writing simply `1u32` will result in a compilation error
// same goes for `return Ok(Ok(1u32))` and `return Ok(Err(e2))`
}