createEnumMemberList = (...members) => {
const memberList = Object.create(null);
memberList.lookup = (name) => {
if (!memberList[name]) {
throw new ReferenceError(`Enum member '${name}' does not exist`);
}
return memberList[name];
};
memberList.reverseLookup = (needle) => {
const entry = Object.entries(memberList).find(
([prop, val]) => val === needle
);
return !!entry ? entry[0] : null;
};
const parseEntry = (entry) => {
if (Array.isArray(entry)) {
return [entry[0], entry[1]];
}
if (typeof entry === "string") {
return [entry, Symbol(entry)];
}
throw new SyntaxError(
`Entry must either be a string or a [<string>,<any>] tuple: ${entry} :: ${typeof entry}`
);
};
members.forEach((member) => {
const [name, value] = parseEntry(member);
if (name.toUpperCase() !== name) {
throw new SyntaxError(
`Member ${name} must be provided as uppercase (${name.toUpperCase()})`
);
}
if (Object.keys(memberList).indexOf(name) !== -1) {
throw new ReferenceError(`Enum already contains member ${name}`);
}
memberList[name] = value;
});
return memberList;
}