added: `catch` method on Result
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 27 Feb 2023 00:08:06 +0000 (18:08 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 27 Feb 2023 00:08:18 +0000 (18:08 -0600)
core/container/result.onyx
core/os/file.onyx

index 147e4bfe10548cc1e2f9164fbe0393597c2f28fa..4abe691ebc28cdb4761b53fe79af60da6343de3c 100644 (file)
@@ -92,6 +92,13 @@ Result_Data :: struct (T: type_expr, E: type_expr) {
         return #from_enclosing v;
     }
 
+    catch :: macro (r: Result($T, $E), on_err: Code) -> T {
+        res := r;
+        if res.status == .Ok do return res.__data.value;
+
+        #unquote on_err;
+    }
+
     format :: (o: ^conv.Format_Output, format: ^conv.Format, res: ^Result($T, $E)) {
         if res.status == .Ok {
             conv.format(o, "{}({\"})", res.status, res.__data.value);
index c67642702a1fc7509cfa63a0bc3e6c792c199a58..277f99df5e92e0291db410339651d49a18e6c91e 100644 (file)
@@ -148,16 +148,21 @@ File_Logger :: struct {
     old_logger: Logger;
 }
 
-file_logger_open :: (filename: str, allocator := context.allocator) -> ^File_Logger {
+file_logger_open :: (filename: str, allocator := context.allocator) -> Result(^File_Logger, str) {
     file_logger := new(File_Logger, allocator);
     file_logger.allocator = allocator;
     file_logger.filename = filename;
 
     file_logger.file = new(File, allocator);
 
-    *file_logger.file = open(filename, mode=.Append)->expect("Unable to open file for logging.");
+    *file_logger.file = open(filename, mode=.Append)->catch(#quote {
+        raw_free(allocator, file_logger.file);
+        raw_free(allocator, file_logger);
 
-    return file_logger;
+        return #from_enclosing .{ .Err, .{error = "Unable to open file for logging."} };
+    });
+
+    return .{ .Ok, .{ value=file_logger } };
 }
 
 file_logger_use :: (logger: ^File_Logger) {