mirror of
https://codeberg.org/ziglings/exercises.git
synced 2024-12-27 01:46:29 +00:00
69 lines
1.9 KiB
Zig
69 lines
1.9 KiB
Zig
//
|
|
// 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;
|
|
}
|