From: Brendan Hansen Date: Mon, 27 Feb 2023 00:08:06 +0000 (-0600) Subject: added: `catch` method on Result X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=3aaf99173b55a9e9a056e2d40214b3c0919d675f;p=onyx.git added: `catch` method on Result --- diff --git a/core/container/result.onyx b/core/container/result.onyx index 147e4bfe..4abe691e 100644 --- a/core/container/result.onyx +++ b/core/container/result.onyx @@ -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); diff --git a/core/os/file.onyx b/core/os/file.onyx index c6764270..277f99df 100644 --- a/core/os/file.onyx +++ b/core/os/file.onyx @@ -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) {