ranczo-io/config.hpp
Bartosz Wieczorek 6da01a2f6b Add HTTP get
2025-12-12 16:57:05 +01:00

163 lines
5.9 KiB
C++

#pragma once
#include <boost/asio/awaitable.hpp>
#include <boost/system/errc.hpp>
#include <boost/system/error_code.hpp>
#include <memory_resource>
#if __has_include(<expected>)
#include <expected>
#elif __has_include(<tl/expected.hpp>)
#include <tl/expected.hpp>
#else
#error "No expected implementation available"
#endif
namespace ranczo {
template<typename T>
std::optional<T> from_string(std::optional< std::string_view > state,
std::pmr::memory_resource * mr = std::pmr::get_default_resource());
#if __has_include(<expected>)
template < typename T >
using expected = std::expected< T, boost::system::error_code >;
template < typename T >
using unexpected = std::unexpected< T >;
#elif __has_include(<tl/expected.hpp>)
template < typename T >
using expected = tl::expected< T, boost::system::error_code >;
template < typename T >
using unexpected = tl::unexpected< T >;
#else
#error "No expected implementation available"
#endif
template < typename T >
using awaitable = boost::asio::awaitable< T >;
template < typename T >
using awaitable_expected = awaitable< expected< T > >;
using _void = expected< void >;
using ::boost::system::errc::make_error_code;
#define TRY(failable) \
({ \
auto _result = failable; \
if(!_result) \
return unexpected{_result.error()}; \
*_result; \
})
#define TRY_MSG(failable, ...) \
({ \
auto _result = (failable); \
if(!_result) { \
spdlog::error(__VA_ARGS__); \
return unexpected{_result.error()}; \
} \
*_result; \
})
#define TRY_TRANSFORM_ERROR(failable, transform) \
({ \
auto _result = (failable); \
if(!_result) \
return unexpected{transform(_result.error())}; \
*_result; \
})
#define CHECK(failable) \
do { \
auto _result = await(failable); \
if(!_result) \
return unexpected(_result.error()); \
} while(0)
#define CHECK_MSG(failable, ...) \
do { \
auto _result = await(failable); \
if(!_result) { \
spdlog::error(__VA_ARGS__); \
return unexpected{_result.error()}; \
} \
} while(0)
#define ASYNC_TRY(failable) \
({ \
auto _result = co_await (failable); \
if(!_result) \
co_return unexpected{_result.error()}; \
*_result; \
})
#define ASYNC_TRY_TRANSFORM_ERROR(failable, transform) \
({ \
auto _result = co_await (failable); \
if(!_result) \
co_return unexpected{transform(_result.error())}; \
*_result; \
})
#define ASYNC_TRY_MSG(failable, ...) \
({ \
auto _result = co_await (failable); \
if(!_result) { \
spdlog::error(__VA_ARGS__); \
co_return unexpected{_result.error()}; \
} \
*_result; \
})
#define ASYNC_CHECK(failable) \
do { \
auto _result = co_await (failable); \
if(!_result) \
co_return unexpected(_result.error()); \
} while(0)
#define ASYNC_CHECK_MSG(failable, ...) \
do { \
auto _result = co_await (failable); \
if(!_result) { \
spdlog::error(__VA_ARGS__); \
co_return unexpected{_result.error()}; \
} \
} while(0)
/// asserts that a _log objject is available, usefull for modules
#define ASYNC_CHECK_LOG(failable, ...) \
do { \
auto _result = co_await (failable); \
if(!_result) { \
_log.error(__VA_ARGS__); \
co_return unexpected{_result.error()}; \
} \
} while(0)
#define ASYNC_CHECK_TRANSFORM_ERROR(failable, transform) \
do { \
auto _result = co_await (failable); \
if(!_result) { \
co_return unexpected{transform(_result.error())}; \
} \
} while(0)
#define ASYNC_CHECK_TRANSFORM_ERR_LOG(failable, transform, ...) \
do { \
auto _result = co_await (failable); \
if(!_result) { \
_log.error(__VA_ARGS__); \
co_return unexpected{transform(_result.error())}; \
} \
} while(0)
} // namespace ranczo