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.