/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-11 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #ifndef __JUCE_RESULT_JUCEHEADER__ #define __JUCE_RESULT_JUCEHEADER__ #include "../text/juce_String.h" //============================================================================== /** Represents the 'success' or 'failure' of an operation, and holds an associated error message to describe the error when there's a failure. E.g. @code Result myOperation() { if (doSomeKindOfFoobar()) return Result::ok(); else return Result::fail ("foobar didn't work!"); } const Result result (myOperation()); if (result.wasOk()) { ...it's all good... } else { warnUserAboutFailure ("The foobar operation failed! Error message was: " + result.getErrorMessage()); } @endcode */ class JUCE_API Result { public: //============================================================================== /** Creates and returns a 'successful' result. */ static Result ok() noexcept; /** Creates a 'failure' result. If you pass a blank error message in here, a default "Unknown Error" message will be used instead. */ static Result fail (const String& errorMessage) noexcept; //============================================================================== /** Returns true if this result indicates a success. */ bool wasOk() const noexcept; /** Returns true if this result indicates a failure. You can use getErrorMessage() to retrieve the error message associated with the failure. */ bool failed() const noexcept; /** Returns true if this result indicates a success. This is equivalent to calling wasOk(). */ operator bool() const noexcept; /** Returns true if this result indicates a failure. This is equivalent to calling failed(). */ bool operator!() const noexcept; /** Returns the error message that was set when this result was created. For a successful result, this will be an empty string; */ const String& getErrorMessage() const noexcept; //============================================================================== Result (const Result& other); Result& operator= (const Result& other); #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS Result (Result&& other) noexcept; Result& operator= (Result&& other) noexcept; #endif bool operator== (const Result& other) const noexcept; bool operator!= (const Result& other) const noexcept; private: String errorMessage; explicit Result (const String& errorMessage) noexcept; // These casts are private to prevent people trying to use the Result object in numeric contexts operator int() const; operator void*() const; }; #endif // __JUCE_RESULT_JUCEHEADER__