Skip to content

Commit

Permalink
includes/type: Changes to magic type to include address of failed ass…
Browse files Browse the repository at this point in the history
…erts. (#217)
  • Loading branch information
paxcut authored Jan 9, 2024
1 parent 6f7988e commit fb5fcba
Showing 1 changed file with 24 additions and 19 deletions.
43 changes: 24 additions & 19 deletions includes/type/magic.pat
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};

}

}

0 comments on commit fb5fcba

Please sign in to comment.