This is a draft PR trying to make some improvements to the BResult
class to make it more usable. Adds a util::Result
class with the following improvements (and implements BResult
in terms of it so existing code doesn’t have to change):
-
Supports returning error strings and error information at the same time. This functionality is needed by the
LoadChainstate
function in #25308 or any function that can fail in multiple ways which need to be handled differently. And it means Result class is compatible with rust-style error handling and pattern matching, unlike BResult. -
Makes Result class provide same operators and methods as std::optional, so it doesn’t require calling less familiar
HasRes
/GetObj
/ReleaseObj
methods, and so error reporting functionality can be easily added or dropped from existing code by switching between util::Result and std::optional. -
Supports
Result<void>
return values, so it is possible to return error reporting information from functions in a uniform way even if they don’t have other return values. -
Supports
Result<bilingual_str>
return values. Drops ambiguous and potentially misleadingBResult
constructor that treats any bilingual string as an error, and any other type as a non-error. Addsutil::Error
constructor so errors have to be explicitly constructed and not anybilingual_str
will be turned into one. -
Puts
src/util/
code in theutil::
namespace so naming reflects code organization and it is obvious where the class is coming from. Drops “B” from name because it is undocumented what it stands for (bilingual?) -
Adds unit tests.