Skip to content

Commit

Permalink
add docs and missing test case for merging error sets
Browse files Browse the repository at this point in the history
See #367
  • Loading branch information
andrewrk committed Jun 12, 2018
1 parent 13d3255 commit 86adc1e
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
45 changes: 44 additions & 1 deletion doc/langref.html.in
Expand Up @@ -3117,7 +3117,50 @@ test "error union" {
comptime assert(@typeOf(foo).ErrorSet == error);
}
{#code_end#}
<p>TODO the <code>||</code> operator for error sets</p>
{#header_open|Merging Error Sets#}
<p>
Use the <code>||</code> operator to merge two error sets together. The resulting
error set contains the errors of both error sets. Doc comments from the left-hand
side override doc comments from the right-hand side. In this example, the doc
comments for <code>C.PathNotFound</code> is <code>A doc comment</code>.
</p>
<p>
This is especially useful for functions which return different error sets depending
on {#link|comptime#} branches. For example, the Zig standard library uses
<code>LinuxFileOpenError || WindowsFileOpenError</code> for the error set of opening
files.
</p>
{#code_begin|test#}
const A = error{
NotDir,

/// A doc comment
PathNotFound,
};
const B = error{
OutOfMemory,

/// B doc comment
PathNotFound,
};

const C = A || B;

fn foo() C!void {
return error.NotDir;
}

test "merge error sets" {
if (foo()) {
@panic("unexpected");
} else |err| switch (err) {
error.OutOfMemory => @panic("unexpected"),
error.PathNotFound => @panic("unexpected"),
error.NotDir => {},
}
}
{#code_end#}
{#header_close#}
{#header_open|Inferred Error Sets#}
<p>
Because many functions in Zig return a possible error, Zig supports inferring the error set.
Expand Down
1 change: 1 addition & 0 deletions test/behavior.zig
Expand Up @@ -31,6 +31,7 @@ comptime {
_ = @import("cases/incomplete_struct_param_tld.zig");
_ = @import("cases/ir_block_deps.zig");
_ = @import("cases/math.zig");
_ = @import("cases/merge_error_sets.zig");
_ = @import("cases/misc.zig");
_ = @import("cases/namespace_depends_on_compile_var/index.zig");
_ = @import("cases/new_stack_call.zig");
Expand Down
21 changes: 21 additions & 0 deletions test/cases/merge_error_sets.zig
@@ -0,0 +1,21 @@
const A = error{
PathNotFound,
NotDir,
};
const B = error{OutOfMemory};

const C = A || B;

fn foo() C!void {
return error.NotDir;
}

test "merge error sets" {
if (foo()) {
@panic("unexpected");
} else |err| switch (err) {
error.OutOfMemory => @panic("unexpected"),
error.PathNotFound => @panic("unexpected"),
error.NotDir => {},
}
}

0 comments on commit 86adc1e

Please sign in to comment.