feat(examples): match on Err in Task example

This commit is contained in:
rvcas 2021-04-10 17:19:29 -04:00
parent 40251b5f28
commit f65978d7d0
4 changed files with 30 additions and 10 deletions

View File

@ -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"

View File

@ -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

View File

@ -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 ->

View File

@ -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 {