libcute 0.1
Loading...
Searching...
No Matches
result.h
Go to the documentation of this file.
1#pragma once
2
5#include <stdbool.h>
6
7#include "macro.h"
8
10#define CU_RESULT_NAME(NAME) NAME##_Result
12#define CU_RESULT_FN(NAME, SUFFIX) CU_CONCAT(CU_RESULT_NAME(NAME), SUFFIX)
13
15#define CU_RESULT_HEADER(NAME, T, E) \
16 CU_RESULT_NAME(NAME) CU_RESULT_FN(NAME, _ok)(T value); \
17 CU_RESULT_NAME(NAME) CU_RESULT_FN(NAME, _error)(E error); \
18 bool CU_RESULT_FN(NAME, _is_ok)(CU_RESULT_NAME(NAME) * result); \
19 T CU_RESULT_FN(NAME, _unwrap)(CU_RESULT_NAME(NAME) * result); \
20 E CU_RESULT_FN(NAME, _unwrap_error)(CU_RESULT_NAME(NAME) * result);
21
23#define CU_RESULT_DECL(NAME, T, E) \
24 typedef struct { \
25 union { \
26 T value; \
27 E error; \
28 }; \
29 bool isOk; \
30 } CU_RESULT_NAME(NAME); \
31 CU_RESULT_HEADER(NAME, T, E)
32
34#define CU_RESULT_IMPL(NAME, T, E) \
35 CU_RESULT_NAME(NAME) CU_RESULT_FN(NAME, _ok)(T value) { \
36 CU_RESULT_NAME(NAME) result = {0}; \
37 result.value = value; \
38 result.isOk = true; \
39 return result; \
40 } \
41 \
42 CU_RESULT_NAME(NAME) CU_RESULT_FN(NAME, _error)(E error) { \
43 CU_RESULT_NAME(NAME) result = {0}; \
44 result.error = error; \
45 result.isOk = false; \
46 return result; \
47 } \
48 \
49 bool CU_RESULT_FN(NAME, _is_ok)(CU_RESULT_NAME(NAME) * result) { \
50 return result->isOk; \
51 } \
52 \
53 T CU_RESULT_FN(NAME, _unwrap)(CU_RESULT_NAME(NAME) * result) { \
54 if (!result->isOk) { \
55 CU_DIE("Attempted to unwrap an error result"); \
56 } \
57 return result->value; \
58 } \
59 \
60 E CU_RESULT_FN(NAME, _unwrap_error)(CU_RESULT_NAME(NAME) * result) { \
61 if (result->isOk) { \
62 CU_DIE("Attempted to unwrap an ok result as error"); \
63 } \
64 return result->error; \
65 }