This class is used as a compatible drop-in for the <format>'s' and fmtlib's respective format_error class; of which the main purpose to issue warnings and errors from the custom formatters listed below. Serenity's 'format_error' inherits from std::runtime_error.
class format_error: public std::runtime_error
{
public:
inline explicit format_error(const char* message): std::runtime_error(message) { }
inline explicit format_error(const std::string& message): std::runtime_error(message) { }
inline format_error(const format_error&) = default;
inline format_error& operator=(const format_error&) = default;
inline format_error(format_error&&) = default;
inline format_error& operator=(format_error&&) = default;
inline ~format_error() noexcept override = default;
};
This static array is used to index into from the ReportCustomError() function to issue the warning or error and contains the following messages:
static constexpr std::arraycustom_error_messages = { "Unknown Formatting Error Occurred In Internal Serenity CustomFlag Formatting.", "Error In Internal CustomFlag Formatting For Serenity: Missing '%' before flag.", "Error In Internal CustomFlag Formatting For Serenity: An Escaped Opening Bracket Was Detected - Missing Escaped Closing Bracket.", "Error In Internal CustomFlag Formatting For Serenity: An Unsupported Flag Was Encountered.", "Error In Internal CustomFlag Formatting For Serenity: Flag Specifier Token Found, But With No Flag Present.", };
This enum is what is used specifically for `ReportCustomError()` as well as what is used to map the error messages to the actual error.
enum class CustomErrors
{
missing_enclosing_bracket,
missing_flag_specifier,
unknown_flag,
token_with_no_flag,
no_flag_mods,
};
This function is essentially a wrapper that uses a `CustomErrors` enum value in order to index into the `custom_error_messages` array for error reporting.
[[noreturn]] constexpr void ReportCustomError(CustomErrors err) {
using enum CustomErrors;
switch( err ) {
case missing_flag_specifier: throw format_error(custom_error_messages[ 1 ]); break;
case missing_enclosing_bracket: throw format_error(custom_error_messages[ 2 ]); break;
case unknown_flag: throw format_error(custom_error_messages[ 3 ]); break;
case token_with_no_flag: throw format_error(custom_error_messages[ 4 ]); break;
case no_flag_mods: throw format_error(custom_error_messages[ 5 ]); break;
default: throw format_error(custom_error_messages[ 0 ]); break;
}
}