return generate();
}
+ #doc """
+ Returns the value inside the optional, if there is one.
+ If not, an assertion is thrown and the context's assert
+ handler must take care of it.
+ """
+ unwrap :: (o: Optional) -> o.Value_Type {
+ if o.has_value do return o.value;
+ assert(false, "Unwrapping empty Optional.");
+ }
+
hash :: (o: Optional($T/core.hash.Hashable)) -> u32 {
if !o.has_value do return 0;
return core.hash.to_u32(o.value);
return r.__data.value;
}
+ expect :: (r: #Self, msg: str) -> r.Ok_Type {
+ if r.status == .Err {
+ assert(false, msg);
+ return .{};
+ }
+
+ return r.__data.value;
+ }
+
transform :: (r: #Self, f: (r.Ok_Type) -> $R) => {
if r.status == .Err do return r;
return .{ .Ok, .{ value = f(r.__data.value) } };
return #from_enclosing .{ .Err, .{ error = res.__data.error } };
}
+ or_return :: macro (r: Result($T, $E), v: $V) -> T {
+ res := r;
+ if res.status == .Ok do return res.__data.value;
+
+ return #from_enclosing v;
+ }
+
format :: (o: ^conv.Format_Output, format: ^conv.Format, res: ^Result($T, $E)) {
if res.status == .Ok {
conv.format(o, "{}({\"})", res.status, res.__data.value);
return data[0 .. size];
}
-open :: (path: str, mode := OpenMode.Read) -> (os.FileError, File) {
+open :: (path: str, mode := OpenMode.Read) -> Result(File, os.FileError) {
file := File.{
stream = .{ vtable = null },
data = .{},
};
file_data, error := fs.__file_open(path, mode);
- if error != .None do return error, file;
+ if error != .None do return .{ .Err, .{error=error} };
file.data = file_data;
file.vtable = ^fs.__file_stream_vtable;
- return .None, file;
+ return .{ .Ok, .{value=file} };
}
close :: (file: ^File) {
get_contents_from_file,
(path: str) -> str {
- error, file := open(path, .Read);
- if error != .None do return .{ null, 0 };
+ file := open(path, .Read)->or_return(null_str);
defer close(^file);
return get_contents(^file);
}
c := new(Context);
- if err, file_stream := open(path, mode); err == .None {
- c.file_stream = file_stream;
+ if file_stream := open(path, mode); file_stream {
+ c.file_stream = file_stream->unwrap();
c.valid_file_stream = true;
}
file_logger.file = new(File, allocator);
- error := os.FileError.None;
- error, *file_logger.file = open(filename, mode=.Append);
- assert(error == .None, "Unable to open file for logging.");
+ *file_logger.file = open(filename, mode=.Append)->expect("Unable to open file for logging.");
return file_logger;
}