#pragma once #include "prelude/string.hpp" #include struct Error { enum class Type { PARSE = 0, TYPE, COMPILE, COUNT_ERROR_TYPES, }; Type type; StringView message; StringView filename; long line = 0; long offset = 0; public: static Error CompileError(StringView filename, StringView message, long line = 0, long offset = 0) { return Error{Type::COMPILE, message, filename, line, offset}; } static Error ParseError(StringView filename, StringView message, long line = 0, long offset = 0) { return Error{Type::PARSE, message, filename, line, offset}; } static Error TypeError(StringView filename, StringView message, long line = 0, long offset = 0) { return Error{Type::TYPE, message, filename, line, offset}; } }; constexpr const char* ErrorTypeNames[] = { "ParseError", "TypeError", "CompileError", }; class ErrorLogger { public: static void Raise(const Error &error) { StringBuilder sb; sb.AppendFormat("%s:%zu:%zu %s: %s", error.filename.c_str(), error.line, error.offset, ErrorTypeNames[static_cast(error.type)], error.message.c_str()); std::println("{}", sb.c_str()); std::exit(1); } };