includes/type: Changes to magic type to include address of failed asserts. (#217)

This commit is contained in:
paxcut
2024-01-09 16:36:17 -07:00
committed by GitHub
parent 6f7988e96e
commit fb5fcbafc1

View File

@@ -7,32 +7,37 @@
Types used to parse and enforce specific magic numbers
*/
namespace type {
namespace type
{
fn fm(ref auto value)
{
str result;
for (u32 i = 0, i < sizeof(value), i += 1)
{
char c = value[i];
if (std::ctype::isprint(c))
result += c;
else
result += std::format("\\x{:02X}", u8(c));
}
return std::format("\"{}\"", result);
};
/**
A Magic number. Throws an error if the magic number does not match the expected value
@tparam ExpectedValue A string representing the expected value
*/
struct Magic<auto ExpectedValue> {
struct Magic<auto ExpectedValue>
{
char value[std::string::length(ExpectedValue)];
std::assert(value == ExpectedValue, std::format("Invalid magic value! Expected \"{}\", got \"{}\".", ExpectedValue, value));
std::assert_warn(value == ExpectedValue, std::format("Invalid magic value! Expected {}, got {} at position 0x{:X}", type::fm(ExpectedValue), type::fm(value), $ - std::string::length(ExpectedValue)));
} [[sealed, format("type::impl::format_magic")]];
namespace impl {
fn format_magic(ref auto magic) {
str result;
for (u32 i = 0, i < sizeof(magic.value), i += 1) {
char c = magic.value[i];
if (std::ctype::isprint(c))
result += c;
else
result += std::format("\\x{:02X}", u8(c));
}
return std::format("\"{}\"", result);
namespace impl
{
fn format_magic(ref auto magic)
{
return fm(magic.value);
};
}
}