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
LoadChainstatefunction 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/ReleaseObjmethods, 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 misleadingBResultconstructor that treats any bilingual string as an error, and any other type as a non-error. Addsutil::Errorconstructor so errors have to be explicitly constructed and not anybilingual_strwill 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.
<!-- *** Please remove the following help text before submitting: *** Pull requests without a rationale and clear improvement may be closed immediately. GUI-related pull requests should be opened against https://github.com/bitcoin-core/gui first. See CONTRIBUTING.md -->
<!-- Please provide clear motivation for your patch and explain how it improves Bitcoin Core user experience or Bitcoin Core developer experience significantly: * Any test improvements or new tests that improve coverage are always welcome. * All other changes should have accompanying unit tests (see `src/test/`) or functional tests (see `test/`). Contributors should note which tests cover modified code. If no tests exist for a region of modified code, new tests should accompany the change. * Bug fixes are most welcome when they come with steps to reproduce or an explanation of the potential issue as well as reasoning for the way the bug was fixed. * Features are welcome, but might be rejected due to design or scope issues. If a feature is based on a lot of dependencies, contributors should first consider building the system outside of Bitcoin Core, if possible. * Refactoring changes are only accepted if they are required for a feature or bug fix or otherwise improve developer experience significantly. For example, most "code style" refactoring changes require a thorough explanation why they are useful, what downsides they have and why they *significantly* improve developer experience or avoid serious programming bugs. Note that code style is often a subjective matter. Unless they are explicitly mentioned to be preferred in the [developer notes](/doc/developer-notes.md), stylistic code changes are usually rejected. -->
<!-- Bitcoin Core has a thorough review process and even the most trivial change needs to pass a lot of eyes and requires non-zero or even substantial time effort to review. There is a huge lack of active reviewers on the project, so patches often sit for a long time. -->