feat(Exception)

This commit is contained in:
2024-09-30 16:17:24 +03:00
parent 7e78bca810
commit 4eaf5b53c0
5 changed files with 111 additions and 0 deletions

View File

@ -14,6 +14,7 @@ OBJS =\
base58\ base58\
base64\ base64\
hash/sha256\ hash/sha256\
Exception
TOOLS = ${LIB} TOOLS = ${LIB}
@ -23,6 +24,7 @@ TESTS =\
test-base58\ test-base58\
test-base64\ test-base64\
hash/test-sha256\ hash/test-sha256\
test-Exception
ifeq (${origin CC}, default) ifeq (${origin CC}, default)
CC = g++ CC = g++

View File

@ -1,6 +1,7 @@
#include <basen/base58.hpp> #include <basen/base58.hpp>
#include <basen/base64.hpp> #include <basen/base64.hpp>
#include <basen/baseN.hpp> #include <basen/baseN.hpp>
#include <basen/Exception.hpp>
#include <basen/hash/sha256.hpp> #include <basen/hash/sha256.hpp>
#include <basen/hex.hpp> #include <basen/hex.hpp>

View File

@ -0,0 +1,44 @@
#pragma once
#include <cstdint>
#include <exception>
#include <source_location>
#include <string>
#include <unordered_map>
namespace basen
{
class Exception : public std::exception
{
public:
enum class Code
{
BASE,
PADDING,
CHECKSUM,
OVERFLOW,
LENGTH,
OUT_OF_ALPH,
ALPH_COLLISION
};
static const std::unordered_map<Code, std::string> messages;
Exception(Code code, const std::source_location &location = std::source_location::current());
const char *what() const noexcept override
{
return _what.c_str();
}
inline const char *message() const noexcept
{
return messages.at(_code).c_str();
}
inline Code code() const noexcept
{
return _code;
}
private:
Code _code;
std::string _what;
};
}

29
src/Exception.cpp Normal file
View File

@ -0,0 +1,29 @@
#include <sstream>
#include <basen/Exception.hpp>
namespace basen
{
const std::unordered_map<Exception::Code, std::string> Exception::messages = {
{Code::BASE, "incorrect base"},
{Code::PADDING, "incorrect padding"},
{Code::CHECKSUM, "incorrect checksum"},
{Code::OVERFLOW, "overflow"},
{Code::LENGTH, "not enough allocated length"},
{Code::OUT_OF_ALPH, "out of alphabet"},
{Code::ALPH_COLLISION, "alphabet contains same chars"},
};
Exception::Exception(Code code, const std::source_location &location)
{
_code = code;
std::ostringstream oss;
oss << "\033[34m"
<< location.function_name()
<< ':'
<< location.line()
<< ": \033[31mbasen::Exception:\n\t\033[0m"
<< message()
<< "\n";
_what = oss.str();
}
}

35
test/test-Exception.cpp Normal file
View File

@ -0,0 +1,35 @@
#include <basen/Exception.hpp>
#include <gtest/gtest.h>
TEST(Exception, Exception)
{
EXPECT_ANY_THROW(throw basen::Exception(basen::Exception::Code::BASE));
}
TEST(Exception, message)
{
try
{
throw basen::Exception(basen::Exception::Code::BASE);
}
catch (const basen::Exception &e)
{
EXPECT_STREQ(e.message(), "incorrect base");
}
}
TEST(Exception, code)
{
try
{
throw basen::Exception(basen::Exception::Code::BASE);
}
catch (const basen::Exception &e)
{
EXPECT_EQ(uint32_t(e.code()), uint32_t(basen::Exception::Code::BASE));
}
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}