AK: Simplify Result class so we can start using it

There were some ideas about how to use this class but we never actually
started using it, so let's just simplify it and get it ready for use.

The basic idea is: a function returns a Result<ValueType, ErrorType>.
Callers check if the result object is_error(). If so, an ErrorType can
be fetched with the error() getter. Otherwise, a ValueType is fetched
with the value() getter. That's it. :^)
This commit is contained in:
Andreas Kling 2020-04-21 13:27:03 +02:00
parent 59cd181ed9
commit ba3b561a40
Notes: sideshowbarker 2024-07-19 07:25:08 +09:00

View file

@ -27,78 +27,65 @@
#pragma once #pragma once
#include <AK/Assertions.h> #include <AK/Assertions.h>
#include <AK/Platform.h>
#include <AK/Optional.h> #include <AK/Optional.h>
namespace AK { namespace AK {
template<typename T, typename E> template<typename ValueType, typename ErrorType>
class CONSUMABLE(unknown) Result { class Result {
public: public:
RETURN_TYPESTATE(unknown) Result(const ValueType& res)
Result(const T& res)
: m_result(res) : m_result(res)
{} {
}
RETURN_TYPESTATE(unknown) Result(const ErrorType& error)
Result(const E& error)
: m_error(error) : m_error(error)
{ {
} }
RETURN_TYPESTATE(unknown) Result(const ValueType& res, const ErrorType& error)
Result(const T& res, const E& error)
: m_result(res) : m_result(res)
, m_error(error) , m_error(error)
{ {
} }
RETURN_TYPESTATE(unknown)
Result(Result&& other) Result(Result&& other)
: m_result(move(other.m_result)) : m_result(move(other.m_result))
, m_error(move(other.m_error)) , m_error(move(other.m_error))
{ {
} }
RETURN_TYPESTATE(unknown)
Result(Result& other) Result(Result& other)
: m_result(other.m_result) : m_result(other.m_result)
, m_error(other.m_error) , m_error(other.m_error)
{ {
} }
CALLABLE_WHEN("unknown", "consumed")
~Result() ~Result()
{} {
}
CALLABLE_WHEN(consumed) ValueType& value()
T& unwrap() { {
return m_result.value(); return m_result.value();
} }
CALLABLE_WHEN(consumed) ErrorType& error()
E& error() { {
return m_error.value(); return m_error.value();
} }
bool has_error() const { bool is_error() const
{
return m_error.has_value(); return m_error.has_value();
} }
bool has_value() const {
return m_result.has_value();
}
SET_TYPESTATE(consumed)
bool failed() const {
return m_error.value().failed();
}
private: private:
Optional<T> m_result; Optional<ValueType> m_result;
Optional<E> m_error; Optional<ErrorType> m_error;
}; };
} }
using AK::Result; using AK::Result;