mirror of
https://github.com/roc-lang/roc.git
synced 2024-09-20 15:27:45 +03:00
feat(examples): match on Err in Task example
This commit is contained in:
parent
40251b5f28
commit
f65978d7d0
@ -3,13 +3,21 @@ app "task-example"
|
||||
imports [ base.Task.{ Task }, base.File, base.Path ]
|
||||
provides [ main ] to base
|
||||
|
||||
main : Task.Task {} (File.FileReadErr [ BadUtf8 Str.Utf8ByteProblem Nat ])
|
||||
main : Task.Task {} []
|
||||
main =
|
||||
when Path.fromStr "Cargo.toml" is
|
||||
when Path.fromStr "vendor" is
|
||||
Ok path ->
|
||||
{} <- Task.await (Task.putLine "Our Cargo.toml:")
|
||||
|
||||
line <- Task.await (File.readUtf8 path)
|
||||
result <- Task.attempt (File.readUtf8 path)
|
||||
|
||||
# pathStr = Path.toStr path
|
||||
|
||||
when result is
|
||||
Ok contents -> Task.putLine contents
|
||||
Err (FileNotFound _) -> Task.putLine "file not found"
|
||||
Err (BadUtf8 _ _) -> Task.putLine "bad utf8"
|
||||
Err (FileWasDir _) -> Task.putLine "file was dir"
|
||||
Err _ -> Task.putLine "Error retrieving file - error"
|
||||
|
||||
Task.putLine line
|
||||
_ -> Task.putLine "invalid path"
|
||||
|
@ -1,8 +1,8 @@
|
||||
platform folkertdev/foo
|
||||
requires { main : Task {} * }
|
||||
requires { main : Task {} [] }
|
||||
exposes []
|
||||
packages {}
|
||||
imports [ Task, File ]
|
||||
imports [ Task ]
|
||||
provides [ mainForHost ]
|
||||
effects fx.Effect
|
||||
{
|
||||
@ -11,5 +11,5 @@ platform folkertdev/foo
|
||||
putLine : Str -> Effect {}
|
||||
}
|
||||
|
||||
mainForHost : Task.Task {} (File.FileReadErr [ BadUtf8 Str.Utf8ByteProblem Nat ]) as Fx
|
||||
mainForHost : Task.Task {} [] as Fx
|
||||
mainForHost = main
|
||||
|
@ -1,5 +1,5 @@
|
||||
interface Task
|
||||
exposes [ Task, succeed, fail, await, map, putLine ]
|
||||
exposes [ Task, succeed, fail, await, map, putLine, attempt ]
|
||||
imports [ fx.Effect ]
|
||||
|
||||
|
||||
@ -23,6 +23,13 @@ await = \effect, transform ->
|
||||
Ok a -> transform a
|
||||
Err err -> Task.fail err
|
||||
|
||||
attempt : Task a b, (Result a b -> Task c d) -> Task c d
|
||||
attempt = \effect, transform ->
|
||||
Effect.after effect \result ->
|
||||
when result is
|
||||
Ok ok -> transform (Ok ok)
|
||||
Err err -> transform (Err err)
|
||||
|
||||
map : Task a err, (a -> b) -> Task b err
|
||||
map = \effect, transform ->
|
||||
Effect.after effect \result ->
|
||||
|
@ -108,12 +108,17 @@ pub const ReadResult = extern struct {
|
||||
|
||||
pub export fn roc_fx_readAllUtf8(rocPath: RocStr) callconv(.C) ReadResult {
|
||||
var dir = std.fs.cwd();
|
||||
var content = dir.readFileAlloc(testing.allocator, rocPath.asSlice(), 1024) catch unreachable;
|
||||
|
||||
var content = dir.readFileAlloc(testing.allocator, rocPath.asSlice(), 1024) catch |e| switch (e) {
|
||||
error.FileNotFound => return .{ .bytes = RocStr.empty(), .errno = 2 },
|
||||
error.IsDir => return .{ .bytes = RocStr.empty(), .errno = 19 },
|
||||
else => return .{ .bytes = RocStr.empty(), .errno = 9999 },
|
||||
};
|
||||
|
||||
var str_ptr = @ptrCast([*]u8, content);
|
||||
var roc_str3 = RocStr.init(testing.allocator, str_ptr, content.len);
|
||||
|
||||
return ReadResult{ .bytes = roc_str3, .errno = 0 };
|
||||
return .{ .bytes = roc_str3, .errno = 0 };
|
||||
}
|
||||
|
||||
pub fn roc_fx_readAllUtf8_that_does_not_work(rocPath: *RocStr) ReadResult {
|
||||
|
Loading…
Reference in New Issue
Block a user