2026-06-05 13:44:39 +09:00

138 lines
3.5 KiB
C++

#pragma once
#include <memory>
#include <string>
#include <vector>
#include <sstream>
const int _EL1_MULTIPLIER = 1'000'000 * -1;
const int _EL2_MULTIPLIER = 1'000 * -1;
enum HermesErrorL1 {
E1_OK = 0 * _EL1_MULTIPLIER,
E1_GENERIC = 1 * _EL1_MULTIPLIER,
E1_RESOURCE = 2 * _EL1_MULTIPLIER,
E1_ARGUMENT = 3 * _EL1_MULTIPLIER,
E1_NETWORK = 4 * _EL1_MULTIPLIER,
E1_SECURITY = 5 * _EL1_MULTIPLIER,
};
enum HermesErrorL2 {
E2_UNKNOWN = 0 * _EL2_MULTIPLIER,
E2_CANCELLED = 1 * _EL2_MULTIPLIER,
E2_ABORTED = 2 * _EL2_MULTIPLIER,
E2_CRASH = 3 * _EL2_MULTIPLIER,
E2_TIMEOUT = 4 * _EL2_MULTIPLIER,
E2_OVERFLOW = 5 * _EL2_MULTIPLIER,
E2_PRECONDITION_FAILURE = 6 * _EL2_MULTIPLIER,
E2_NOT_READY = 7 * _EL2_MULTIPLIER,
E2_ALREADY_EXIST = 8 * _EL2_MULTIPLIER,
E2_INTERNAL_ERROR = 9 * _EL2_MULTIPLIER,
E2_UNIMPLEMENTED = 10 * _EL2_MULTIPLIER,
E2_NOT_SUPPORTED = 11 * _EL2_MULTIPLIER,
E2_INVALID_ARGUMENT = 12 * _EL2_MULTIPLIER,
E2_OUT_OF_RANGE = 13 * _EL2_MULTIPLIER,
E2_NOT_FOUND = 14 * _EL2_MULTIPLIER,
E2_UNAVAILABLE = 15 * _EL2_MULTIPLIER,
E2_BUSY = 16 * _EL2_MULTIPLIER,
E2_NOT_CONNECTED = 17 * _EL2_MULTIPLIER,
E2_NO_RESPONSE = 18 * _EL2_MULTIPLIER,
E2_REFUSED = 19 * _EL2_MULTIPLIER,
E2_PERMISSION_DENIED = 20 * _EL2_MULTIPLIER,
};
static
const std::vector<std::string> E1_ERR_MESSAGE {
"OK",
"GENERIC",
"RESOURCE",
"ARGUMENT",
"NETWORK",
"SECURITY",
};
static
const std::vector<std::string> E2_ERR_MESSAGE {
"",
"CANCELLED",
"ABORTED",
"CRASH",
"TIMEOUT",
"OVERFLOW",
"PRECONDITION_FAILURE",
"NOT_READY",
"ALREADY_EXIST",
"INTERNAL_ERROR",
"UNIMPLEMENTED",
"NOT_SUPPORTED",
"INVALID_ARGUMENT",
"OUT_OF_RANGE",
"NOT_FOUND",
"UNAVAILABLE",
"BUSY",
"NOT_CONNECTED",
"NO_RESPONSE",
"REFUSED",
"PERMISSION_DENIED",
};
inline auto EC(
HermesErrorL1 lev1,
HermesErrorL2 lev2 = E2_UNKNOWN,
int lev3 = 0
) -> int
{
return lev1 + lev2 + (lev3 % _EL2_MULTIPLIER);
};
inline std::string err_msg(int errorCode)
{
int e1 = errorCode / _EL1_MULTIPLIER;
int e2 = errorCode % _EL1_MULTIPLIER / _EL2_MULTIPLIER;
int e3 = errorCode % _EL2_MULTIPLIER;
std::stringstream ss;
ss << E1_ERR_MESSAGE[e1];
const auto& e2Str = E2_ERR_MESSAGE[e2];
if (e2Str.size() > 0)
ss << " > " << e2Str;
if (e3)
ss << " > E3(" << e3 << ')';
return ss.str();
}
#if defined(_WIN32) || defined(WIN32)
#include <Windows.h>
inline
std::unique_ptr<char[]> winapiGetLastError(DWORD errCode)
{
static const int BUF_SIZE = 512;
auto strBuf = std::make_unique<char[]>(BUF_SIZE);
int n = _snprintf_s(strBuf.get(), BUF_SIZE - 1, BUF_SIZE - 1, "(%d)", errCode);
DWORD count = ::FormatMessageA(
FORMAT_MESSAGE_FROM_SYSTEM,
nullptr,
errCode,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
strBuf.get() + n,
BUF_SIZE - n - 1,
nullptr);
if (count >= 2) strBuf[n + count - 2] = 0;
return strBuf;
}
inline
std::unique_ptr<char[]> winapiGetLastError()
{
return winapiGetLastError(::GetLastError());
}
#endif