From 335a78f8f5ef8b86922dc241422acb033e0b3b2a Mon Sep 17 00:00:00 2001 From: Nuno Mendes <98030270+nm-remarkable@users.noreply.github.com> Date: Sun, 15 Sep 2024 20:14:49 +0200 Subject: [PATCH] 108: Add a exercise for a labeled switch --- build.zig | 6 ++++++ exercises/108_labeled_switch.zig | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 exercises/108_labeled_switch.zig diff --git a/build.zig b/build.zig index 0ddc23f..06d6483 100644 --- a/build.zig +++ b/build.zig @@ -1197,6 +1197,12 @@ const exercises = [_]Exercise{ \\Successfully Read 18 bytes: It's zigling time! , }, + .{ + .main_file = "108_labeled_switch.zig", + .output = + \\The pull request has been merged + , + }, .{ .main_file = "999_the_end.zig", .output = diff --git a/exercises/108_labeled_switch.zig b/exercises/108_labeled_switch.zig new file mode 100644 index 0000000..623e359 --- /dev/null +++ b/exercises/108_labeled_switch.zig @@ -0,0 +1,34 @@ +// +// A labeled switch in zig allows the usage of continue and break +// just like loops, these allow you to create very concise +// Finite State Automata to represent state transitions +// +// foo: switch (state) { +// 1 => continue :foo 2, +// 2 => continue :foo 3, +// 3 => return, +// 4 => {}, +// ... +// } +// +const std = @import("std"); + +const PullRequestState = enum { + Draft, + InReview, + Approved, + Rejected, + Merged, +}; + +pub fn main() void { + // Something is wrong, it seems your Pull Request can never be merged + // try to fix it! + pr: switch (@as(PullRequestState, PullRequestState.Draft)) { + PullRequestState.Draft => continue :pr PullRequestState.InReview, + PullRequestState.InReview => continue :pr PullRequestState.Rejected, + PullRequestState.Approved => continue :pr PullRequestState.Merged, + PullRequestState.Rejected => std.debug.print("The pull request has been rejected", .{}), + PullRequestState.Merged => std.debug.print("The pull request has been merged", .{}), + } +}