#ifndef QUERY_RESULT_HPP #define QUERY_RESULT_HPP #include namespace matador::utils { template < typename ValueType, typename ErrorType > class [[nodiscard]] result; template struct is_result : std::false_type {}; template < typename ValueType, typename ErrorType > struct is_result> : std::true_type {}; template < typename ValueType > class ok { public: explicit constexpr ok(const ValueType &value) : value_(value) {} explicit constexpr ok(ValueType &&value) : value_(std::move(value)) {} constexpr ValueType&& release() { return std::move(value_); } const ValueType& value() const { return value_; } private: ValueType value_; }; template < typename ErrorType > class error { public: explicit constexpr error(const ErrorType &error) : error_(error) {} explicit constexpr error(ErrorType &&error) : error_(std::move(error)) {} constexpr ErrorType&& release() { return std::move(error_); } const ErrorType& value() const { return error_; } private: ErrorType error_; }; template < typename ValueType, typename ErrorType > class result { public: using value_type = ok; using error_type = error; result(value_type value) : result_(value) {} // NOLINT(*-explicit-constructor) result(error_type error) : result_(error) {} // NOLINT(*-explicit-constructor) operator bool() const { return is_ok(); } // NOLINT(*-explicit-constructor) [[nodiscard]] bool is_ok() const { return std::holds_alternative(result_); } [[nodiscard]] bool is_error() const { return std::holds_alternative(result_); } ValueType&& release() { return std::get(result_).release(); } ErrorType&& release_error() { return std::get(result_).release(); } const ValueType& value() const { return std::get(result_).value(); } const ErrorType& err() const { return std::get(result_).value(); } ErrorType err() { return std::get(result_).value(); } constexpr const ValueType* operator->() const { return &value(); } constexpr ValueType* operator->() { return &value(); } template result and_then(Func f) { if (is_ok()) { return f(value()); } return *this; } private: std::variant result_; }; } #endif //QUERY_RESULT_HPP