import std.stdio : writeln;
import std.traits : EnumMembers;
foreach (SymbolKind kind; [EnumMembers!SymbolKind])
kind.enumUdatoString.writeln;
`----------------------`.writeln;
string example = enumToString!SymbolKind;
string enumUdatoString(E)(E value)
static foreach (memberName; __traits(allMembers, E))
case mixin(E, '.', memberName):
return __traits(getAttributes, mixin(E, '.', memberName))[0];
alias BaseType = BaseEnumType!E;
static foreach (memberName; __traits(allMembers, E))
alias member = mixin(E.stringof, ".", memberName);
alias udaSeq = __traits(getAttributes, member);
enum BaseType value = member;
enum description = udaSeq[0];
result ~= "%s.%-9s = %-2s | %s\n".format(E.stringof, memberName, value, description);
static if (is(E Base == enum))
alias BaseEnumType = Base;
static assert (0, "`E` is not an enum type");