ladybird/AK/Result.h
Andreas Kling cc4b3cbacc
Some checks are pending
CI / Lagom (false, FUZZ, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (false, NO_FUZZ, macos-14, macOS, Clang) (push) Waiting to run
CI / Lagom (false, NO_FUZZ, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (true, NO_FUZZ, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (macos-14, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Push notes / build (push) Waiting to run
Meta: Update my e-mail address everywhere
2024-10-04 13:19:50 +02:00

123 lines
2 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Assertions.h>
#include <AK/Optional.h>
namespace AK {
template<typename ValueT, typename ErrorT>
class [[nodiscard]] Result {
public:
using ValueType = ValueT;
using ErrorType = ErrorT;
Result(ValueType const& res)
: m_result(res)
{
}
Result(ValueType&& res)
: m_result(move(res))
{
}
Result(ErrorType const& error)
: m_error(error)
{
}
Result(ErrorType&& error)
: m_error(move(error))
{
}
Result(Result&& other) = default;
Result(Result const& other) = default;
~Result() = default;
ValueType& value()
{
return m_result.value();
}
ErrorType& error()
{
return m_error.value();
}
bool is_error() const
{
return m_error.has_value();
}
ValueType release_value()
{
return m_result.release_value();
}
ErrorType release_error()
{
return m_error.release_value();
}
private:
Optional<ValueType> m_result;
Optional<ErrorType> m_error;
};
// Partial specialization for void value type
template<typename ErrorT>
class [[nodiscard]] Result<void, ErrorT> {
public:
using ValueType = void;
using ErrorType = ErrorT;
Result(ErrorType const& error)
: m_error(error)
{
}
Result(ErrorType&& error)
: m_error(move(error))
{
}
Result() = default;
Result(Result&& other) = default;
Result(Result const& other) = default;
~Result() = default;
// For compatibility with TRY().
void value() {};
void release_value() {};
ErrorType& error()
{
return m_error.value();
}
bool is_error() const
{
return m_error.has_value();
}
ErrorType release_error()
{
return m_error.release_value();
}
private:
Optional<ErrorType> m_error;
};
}
#if USING_AK_GLOBALLY
using AK::Result;
#endif