35 lines
1.0 KiB
C
35 lines
1.0 KiB
C
#ifndef _H_MCU_RESULT
|
|
#define _H_MCU_RESULT
|
|
|
|
#include "mcutil/collect/str.h"
|
|
#include <stdbool.h>
|
|
|
|
typedef struct mcu_error_s {
|
|
mcu_str_t reason;
|
|
const char* file;
|
|
int line;
|
|
} mcu_error_t;
|
|
|
|
typedef struct mcu_result_s {
|
|
union {
|
|
void* res;
|
|
mcu_error_t err;
|
|
};
|
|
bool is_err;
|
|
} mcu_result_t;
|
|
|
|
#define Ok(val) (mcu_result_t){ .is_err=false, .res = val }
|
|
#define Err(_reason) (mcu_result_t){ .is_err=true, .err = (mcu_error_t){ .reason=mcu_str_new(_reason), .file=__FILE__, .line=__LINE__ }}
|
|
#define mcu_result_unwrap(result) ({ \
|
|
if ((result).is_err) { \
|
|
printf("%s:%d: PANIC: Unwrapped on error value%s\n", \
|
|
(result).err.file, (result).err.line, \
|
|
(result).err.reason.inner); \
|
|
exit(1); \
|
|
}; \
|
|
(result).res; \
|
|
})
|
|
|
|
|
|
#endif // _H_MCU_RESULT
|