summaryrefslogtreecommitdiffstatshomepage
path: root/exercises/33_iferror.zig
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/33_iferror.zig')
-rw-r--r--exercises/33_iferror.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/exercises/33_iferror.zig b/exercises/33_iferror.zig
new file mode 100644
index 0000000..ed92e94
--- /dev/null
+++ b/exercises/33_iferror.zig
@@ -0,0 +1,49 @@
+//
+// Let's revisit the very first error exercise. This time, we're going to
+// look at a special error-handling type of the "if" statement.
+//
+// if (foo) |value| {
+//
+// // foo was NOT an error; value is the non-error value of foo
+//
+// } else |err| {
+//
+// // foo WAS an error; err is the error value of foo
+//
+// }
+//
+// We'll take it even further and use a switch statement to handle
+// the error types.
+//
+const MyNumberError = error{
+ TooBig,
+ TooSmall,
+};
+
+const std = @import("std");
+
+pub fn main() void {
+ var nums = [_]u8{2,3,4,5,6};
+
+ for (nums) |num| {
+ std.debug.print("{}", .{num});
+
+ var n = numberMaybeFail(num);
+ if (n) |value| {
+ std.debug.print("=4. ", .{});
+ } else |err| switch (err) {
+ MyNumberError.TooBig => std.debug.print(">4. ", .{}),
+ // Please add a match for TooSmall here and have it print: "<4. "
+ }
+ }
+
+ std.debug.print("\n", .{});
+}
+
+// This time we'll have numberMaybeFail() return an error union rather
+// than a straight error.
+fn numberMaybeFail(n: u8) MyNumberError!u8 {
+ if(n > 4) return MyNumberError.TooBig;
+ if(n < 4) return MyNumberError.TooSmall;
+ return n;
+}