From 79c2b417c2bcc3a76f1d4be816c2f7534c27cbca Mon Sep 17 00:00:00 2001 From: Able Date: Thu, 4 Nov 2021 22:58:40 -0500 Subject: [PATCH] Result impl and example --- main.c | 16 ++++++++++++++++ rust.h | 23 ++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index f1f3577..7d1036b 100644 --- a/main.c +++ b/main.c @@ -6,3 +6,19 @@ fn(main(), int) { print("Hello, World!\n", a); Ok(); } + +typedef const char *ErrString; +typedef void *MemHandle; +Result_impl(MemHandle, ErrString) +Result_unwrap_impl(MemHandle, ErrString) +fn (gimmy_memory(size_t n_bytes), Result(MemHandle, ErrString)){ + Result(MemHandle, ErrString) possible = + {.is_valid = true, .data = malloc(n_bytes)}; + + if (!possible.data) + { + possible.is_valid = false; + possible.err = "memory allocation failure"; + } + return possible; +} diff --git a/rust.h b/rust.h index a3aa732..45717a0 100644 --- a/rust.h +++ b/rust.h @@ -1,6 +1,6 @@ #include #include - +#include #define fn(decl, type) type decl #define let(decl, type) const type decl @@ -12,3 +12,24 @@ #define Err(); return 1 #define enum union + +// Rust like return impl +#define Result_impl(T, E) \ +typedef struct { \ + bool is_valid; \ + union { \ + T data; \ + E err; \ + }; \ +} Result_##T##_##E; + +#define Result(T, E) Result_##T##_##E + +#define Result_unwrap_impl(T, E) \ +T Result_##T##_unwrap (Result(T, E) result) { \ + if (result.is_valid) \ + return result.data; \ +\ + fprintf(stderr, "%s\n", result.err); \ + exit(1); \ +}