108_labeled_switch.zig 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  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 => return,
  10. // 4 => {},
  11. // ...
  12. // }
  13. //
  14. const std = @import("std");
  15. const PullRequestState = enum {
  16. Draft,
  17. InReview,
  18. Approved,
  19. Rejected,
  20. Merged,
  21. };
  22. pub fn main() void {
  23. // Something is wrong, it seems your Pull Request can never be merged
  24. // try to 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 => std.debug.print("The pull request has been rejected", .{}),
  30. PullRequestState.Merged => std.debug.print("The pull request has been merged", .{}),
  31. }
  32. }