aboutsummaryrefslogtreecommitdiff
path: root/exercises/24_errors4.zig
diff options
context:
space:
mode:
authorDave Gauer <dave@ratfactor.com>2021-02-09 18:36:57 -0500
committerDave Gauer <dave@ratfactor.com>2021-02-09 18:36:57 -0500
commit55ad7c32f2d534b1fbd438204d21738f958c51a5 (patch)
tree16be4b53193105a759b3eec25be5e664d41c428d /exercises/24_errors4.zig
parentcf0920de31e9b5f3c5ba6de19a1b4c8d0c58b907 (diff)
downloadziglings-55ad7c32f2d534b1fbd438204d21738f958c51a5.tar.gz
ziglings-55ad7c32f2d534b1fbd438204d21738f958c51a5.tar.bz2
ziglings-55ad7c32f2d534b1fbd438204d21738f958c51a5.tar.xz
ziglings-55ad7c32f2d534b1fbd438204d21738f958c51a5.zip
Moved exercises to exercises because exercises
Diffstat (limited to 'exercises/24_errors4.zig')
-rw-r--r--exercises/24_errors4.zig68
1 files changed, 68 insertions, 0 deletions
diff --git a/exercises/24_errors4.zig b/exercises/24_errors4.zig
new file mode 100644
index 0000000..b60cc2d
--- /dev/null
+++ b/exercises/24_errors4.zig
@@ -0,0 +1,68 @@
+//
+// Using `catch` to replace an error with a default value is a bit
+// of a blunt instrument since it doesn't matter what the error is.
+//
+// Catch lets us capture the error value and perform additional
+// actions with this form:
+//
+// canFail() catch |err| {
+// if (err == FishError.TunaMalfunction) {
+// ...
+// }
+// };
+//
+const std = @import("std");
+
+const MyNumberError = error{
+ TooSmall,
+ TooBig,
+};
+
+pub fn main() void {
+ // The "catch 0" below is just our way of dealing with the fact
+ // that makeJustRight() returns a error union (for now).
+ var a: u32 = makeJustRight(44) catch 0;
+ var b: u32 = makeJustRight(14) catch 0;
+ var c: u32 = makeJustRight(4) catch 0;
+
+ std.debug.print("a={}, b={}, c={}", .{a,b,c});
+}
+
+// In this silly example we've split the responsibility of making
+// a number just right into four (!) functions:
+//
+// makeJustRight() Calls fixTooBig(), cannot fix any errors.
+// fixTooBig() Calls fixTooSmall(), fixes TooBig errors.
+// fixTooSmall() Calls detectProblems(), fixes TooSmall errors.
+// detectProblems() Returns the number or an error.
+//
+fn makeJustRight(n: u32) MyNumberError!u32 {
+ return fixTooBig(n) catch |err| { return err; };
+}
+
+fn fixTooBig(n: u32) MyNumberError!u32 {
+ return fixTooSmall(n) catch |err| {
+ if (err == MyNumberError.TooBig) {
+ return 20;
+ }
+
+ return err;
+ };
+}
+
+fn fixTooSmall(n: u32) MyNumberError!u32 {
+ // Oh dear, this is missing a lot! But don't worry, it's nearly
+ // identical to fixTooBig() above.
+ //
+ // If we get a TooSmall error, we should return 10.
+ // If we get any other error, we should return that error.
+ // Otherwise, we return the u32 number.
+ return detectProblems(n) ???
+}
+
+fn detectProblems(n: u32) MyNumberError!u32 {
+ if (n < 10) return MyNumberError.TooSmall;
+ if (n > 20) return MyNumberError.TooBig;
+ return n;
+}
+