/
vit1251
/
cmm
Обзор
Документация
Войти
/
vit1251
/
cmm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/base/errors.cmm
88 строк
2 KB
Vitold S
update
09 авг 2026, 02:25
09 авг 2026, 02:25
a36ae1e
Код
Авторство
О чём код?
// lib/base/errors.cmm — Error types and error handling for C-- // // Provides basic error types for arithmetic operations and a VoidResult type // for functions that can fail but don't return a value. // // Error codes follow common conventions: // 0 = no error (success) // 1 = arithmetic overflow // 2 = arithmetic underflow // 3 = division by zero // 4 = out of bounds // 5 = invalid argument use libc; // Basic error type pub struct Error { code: i32, message: *u8, } impl Error { pub fn new(code: i32, message: *u8) -> Error { Error { code: code, message: message } } pub fn none() -> Error { Error { code: 0, message: 0 } } pub fn overflow() -> Error { Error { code: 1, message: "arithmetic overflow" } } pub fn underflow() -> Error { Error { code: 2, message: "arithmetic underflow" } } pub fn div_zero() -> Error { Error { code: 3, message: "division by zero" } } pub fn out_of_bounds() -> Error { Error { code: 4, message: "out of bounds" } } pub fn invalid_arg() -> Error { Error { code: 5, message: "invalid argument" } } pub fn is_ok(self: *Error) -> bool { self.code == 0 } pub fn code(self: *Error) -> i32 { self.code } pub fn message(self: *Error) -> *u8 { self.message } } // Result for void operations (no value returned, just success/failure) pub struct VoidResult { error: Error, is_ok: bool, } impl VoidResult { pub fn is_ok(self: *VoidResult) -> bool { self.is_ok } pub fn is_err(self: *VoidResult) -> bool { !self.is_ok } pub fn error(self: *VoidResult) -> Error { self.error } pub fn expect(self: *VoidResult, msg: *u8) -> void { if !self.is_ok { printf("Error: "); printf(msg); printf(" — "); let msg_ptr: *u8 = self.error.message; if msg_ptr != 0 { printf(msg_ptr); } printf("\n"); abort(); } } pub fn ok(self: *VoidResult) -> VoidResult { VoidResult { error: Error::none(), is_ok: true } } pub fn err(self: *VoidResult, err: Error) -> VoidResult { VoidResult { error: err, is_ok: false } } }