valeri/src/error.hpp

58 lines
1.7 KiB
C++
Raw Normal View History

#pragma once
enum class ErrorCode {
Success,
2024-07-27 00:01:38 +00:00
OutOfMemory,
2024-07-27 15:25:44 +00:00
IndexOutOfRange,
TypeMismatch,
2024-07-27 22:13:59 +00:00
ReadError,
UnterminatedStringLiteral,
2024-07-28 16:54:04 +00:00
InvalidNumericLiteral,
NotImplemented,
InvalidSymbol,
MalformedList,
2024-08-01 21:45:16 +00:00
KeyError,
EndOfProgram,
2024-08-15 00:18:05 +00:00
CompilationError,
ArgumentCountMismatch,
IOError,
2024-08-26 12:16:05 +00:00
Interrupt,
AssertionFailed,
DivisionByZero,
SyntaxError,
};
2024-08-10 10:17:20 +00:00
class Value;
template <class T>
class Result;
const char* errname(ErrorCode errcode);
2024-08-10 10:17:20 +00:00
void seterr(const char* err);
const char* geterr(void);
const Value& geterrobj(void);
Result<void> seterrobj(const Value&);
void reseterrobj();
2024-08-10 10:17:20 +00:00
#define STRINGIZE_NESTED(A) #A
#define STRINGIZE(A) STRINGIZE_NESTED(A)
#define ERROR(code) \
(({ \
reseterrobj(); \
2024-08-10 10:17:20 +00:00
seterr("Error " STRINGIZE(code) " at " __FILE__ ":" STRINGIZE(__LINE__)); \
ErrorCode::code; \
}))
#define ERROR_FMT(code, ...) \
(({ \
auto name = TRY(Symbol::create(errname(ErrorCode::code))); \
auto message = TRY(build_string(__VA_ARGS__)); \
auto err = Value(TRY(Error::create(name, message))); \
TRY(seterrobj(err)); \
seterr("Error " STRINGIZE(code) " at " __FILE__ ":" STRINGIZE(__LINE__)); \
ErrorCode::code; \
}))