#ifndef _H_MCU_RESULT #define _H_MCU_RESULT #include "mcutil/collect/str.h" #include 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