I also don't like the NS_TRY name, it seems too close to MOZ_TRY. I would prefer to avoid names which are identical except s/NS/MOZ/.
Perhaps NSRESULT_TRY would be a better name? It makes it clear that it is performing the try against the nsresult type. On Mon, May 8, 2017 at 10:17 AM, Ehsan Akhgari <ehsan.akhg...@gmail.com> wrote: > I think these seem like valuable additions to nscore.h. It would be > helpful to extend these facilities that would allow more code to use the > Result-based programming model. > > (I'm not too much of a fan of the NS_TRY name, but can't think of a better > name myself... :/ ) > > > > On 05/07/2017 03:34 PM, Kris Maglione wrote: > >> I've been trying to write most of my new code to use Result.h as much as >> possible. When I have to mix Result-based code with nsresult-based code, >> though, things tend to get ugly, and I wind up writing helpers. At this >> point I've wound up writing the same helpers in 3 or 4 different places, so >> it may be time to try to standardize on something. >> >> The helpers I've been using look something like: >> >> template <> >> class MOZ_MUST_USE_TYPE GenericErrorResult<nsresult> >> { >> nsresult mErrorValue; >> >> template<typename V, typename E2> friend class Result; >> >> public: >> explicit GenericErrorResult(nsresult aErrorValue) : >> mErrorValue(aErrorValue) {} >> >> operator nsresult() { return mErrorValue; } >> }; >> >> static inline Result<Ok, nsresult> >> WrapNSResult(PRStatus aRv) >> { >> if (aRv != PR_SUCCESS) { >> return Err(NS_ERROR_FAILURE); >> } >> return Ok(); >> } >> >> static inline Result<Ok, nsresult> >> WrapNSResult(nsresult aRv) >> { >> if (NS_FAILED(aRv)) { >> return Err(aRv); >> } >> return Ok(); >> } >> >> #define NS_TRY(expr) MOZ_TRY(WrapNSResult(expr)) >> >> And their use looks something like: >> >> Result<nsCOMPtr<nsIFile>, nsresult> >> GetFile(nsIFile* aBase, const char* aChild) >> { >> nsCOMPtr<nsIFile> file; >> NS_TRY(aBase->Clone(getter_AddRefs(file))); >> NS_TRY(aBase->AppendNative(aChild)); >> >> return Move(file); >> } >> >> nsresult >> ReadFile(const char* aPath) >> { >> nsCOMPtr<nsIFile> file; >> MOZ_TRY_VAR(file, GetFile(mBase, aPath)); >> >> PRFileDesc* fd; >> NS_TRY(file->OpenNSPRFileDesc(PR_RDONLY, 0, &fd)); >> >> ... >> return NS_OK; >> } >> >> Where NS_TRY converts a nsresult or PRStatus to an appropriate Result or >> GenericErrorResult, and the GenericErrorResult<nsresult> specialization >> automatically converts an nsresult when used in nsresult-based code. >> >> Does this seem like the kind of thing we should implement in some >> standard header, or would a different approach be better? >> >> -Kris >> _______________________________________________ >> dev-platform mailing list >> dev-platform@lists.mozilla.org >> https://lists.mozilla.org/listinfo/dev-platform >> > > _______________________________________________ > dev-platform mailing list > dev-platform@lists.mozilla.org > https://lists.mozilla.org/listinfo/dev-platform > _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform