50 lines
2.0 KiB
C++
50 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include <cassert>
|
|
#include <cstdint>
|
|
#include <expected>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include <modulus.hpp>
|
|
|
|
|
|
namespace sonus::detail {
|
|
|
|
constexpr std::int32_t error_invalid_argument{1};
|
|
constexpr std::int32_t error_not_found{2};
|
|
constexpr std::int32_t error_unavailable{3};
|
|
constexpr std::int32_t error_internal{4};
|
|
|
|
auto make_error(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> modulus::error;
|
|
auto fail_void(modulus::error error) -> std::expected<void, modulus::error>;
|
|
auto fail_void(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<void, modulus::error>;
|
|
auto fail_void(std::expected<void, modulus::error> const &result) -> std::expected<void, modulus::error>;
|
|
|
|
template <typename VALUE>
|
|
auto fail(modulus::error error) -> std::expected<VALUE, modulus::error>;
|
|
|
|
template <typename VALUE>
|
|
auto fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error>;
|
|
|
|
template <typename VALUE>
|
|
auto fail(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<VALUE, modulus::error>;
|
|
|
|
}
|
|
|
|
template <typename VALUE>
|
|
auto sonus::detail::fail(modulus::error error) -> std::expected<VALUE, modulus::error> {
|
|
return modulus::fail<VALUE>(std::move(error));
|
|
}
|
|
|
|
template <typename VALUE>
|
|
auto sonus::detail::fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error> {
|
|
assert(!result);
|
|
return modulus::fail<VALUE>(result.error());
|
|
}
|
|
|
|
template <typename VALUE>
|
|
auto sonus::detail::fail(std::int32_t code, std::string message, modulus::source_location location) -> std::expected<VALUE, modulus::error> {
|
|
return sonus::detail::fail<VALUE>(sonus::detail::make_error(code, std::move(message), location));
|
|
}
|