2025-07-10 13:29:03 +03:30
|
|
|
#pragma once
|
|
|
|
|
2025-07-28 20:45:24 +03:30
|
|
|
#include <format>
|
2025-07-10 13:29:03 +03:30
|
|
|
#include <logger/logger.hpp>
|
2025-07-28 20:45:24 +03:30
|
|
|
#include <source_location>
|
2025-07-10 13:29:03 +03:30
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
namespace lt {
|
2025-07-10 13:29:03 +03:30
|
|
|
|
2025-07-31 08:42:42 +03:30
|
|
|
template<typename Expression_T, typename... Args_T>
|
|
|
|
struct ensure
|
2025-07-10 13:29:03 +03:30
|
|
|
{
|
2025-07-31 08:42:42 +03:30
|
|
|
ensure(
|
|
|
|
Expression_T expression,
|
|
|
|
std::format_string<Args_T...> fmt,
|
|
|
|
Args_T &&...args,
|
|
|
|
const std::source_location &location = std::source_location::current()
|
|
|
|
)
|
2025-07-11 01:55:46 +03:30
|
|
|
{
|
2025-07-31 08:42:42 +03:30
|
|
|
if (!static_cast<bool>(expression))
|
|
|
|
{
|
|
|
|
throw std::runtime_error { std::format(
|
|
|
|
"exception: {}\nlocation: {}:{}",
|
|
|
|
std::format(fmt, std::forward<Args_T>(args)...),
|
|
|
|
location.file_name(),
|
|
|
|
location.line()
|
|
|
|
) };
|
|
|
|
}
|
2025-07-11 01:55:46 +03:30
|
|
|
}
|
2025-07-10 13:29:03 +03:30
|
|
|
};
|
|
|
|
|
2025-07-11 02:09:02 +03:30
|
|
|
|
2025-07-31 08:42:42 +03:30
|
|
|
template<typename Expression_T, typename... Args_T>
|
|
|
|
ensure(Expression_T, std::format_string<Args_T...>, Args_T &&...)
|
|
|
|
-> ensure<Expression_T, Args_T...>;
|
2025-07-10 13:29:03 +03:30
|
|
|
|
2025-07-11 00:05:48 +03:30
|
|
|
} // namespace lt
|