Zig: enum

const std = @import("std");
const fieldNames = std.meta.fieldNames;
const stringToEnum = std.meta.stringToEnum;
const print = std.debug.print;

const Style = enum {
    menu,
    primary,
    secondary,

    pub fn describe(self: Style) []const u8 {
        return switch (self) {
            .menu => "menu style",
            .primary => "primary style",
            .secondary => "secondary style",
        };
    }
};

pub fn main(_: std.process.Init) !void {
    print("describe: {s}\n", .{Style.primary.describe()});

    for (fieldNames(Style)) |name| print("fieldName: {s}\n", .{name});

    print("from string: {}\n", .{stringToEnum(Style, "primary") orelse unreachable});
}