108_labeled_switch.zig 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. //
  2. // A labeled switch in zig allows the usage of continue and break
  3. // just like loops, these allow you to create very concise
  4. // Finite State Automata to represent state transitions
  5. //
  6. // foo: switch (state) {
  7. // 1 => continue :foo 2,
  8. // 2 => continue :foo 3,
  9. // 3 => break :foo,
  10. // 4 => {},
  11. // ...
  12. // }
  13. //
  14. const std = @import("std");
  15. const PullRequestState = enum(u8) {
  16. Draft,
  17. InReview,
  18. Approved,
  19. Rejected,
  20. Merged,
  21. };
  22. pub fn main() void {
  23. // Oh no, your pull request keeps being rejected,
  24. // how would you fix it?
  25. pr: switch (@as(PullRequestState, PullRequestState.Draft)) {
  26. PullRequestState.Draft => continue :pr PullRequestState.InReview,
  27. PullRequestState.InReview => continue :pr PullRequestState.Rejected,
  28. PullRequestState.Approved => continue :pr PullRequestState.Merged,
  29. PullRequestState.Rejected => {
  30. std.debug.print("The pull request has been rejected", .{});
  31. return;
  32. },
  33. PullRequestState.Merged => break, // Would you know where to break to?
  34. }
  35. std.debug.print("The pull request has been merged", .{});
  36. }