Skip to content

Instantly share code, notes, and snippets.

@TiagoFuelber
Last active October 23, 2019 17:50
Show Gist options
  • Save TiagoFuelber/072b6478e9bb951706935ef6826c7f73 to your computer and use it in GitHub Desktop.
Save TiagoFuelber/072b6478e9bb951706935ef6826c7f73 to your computer and use it in GitHub Desktop.
Enum constructor
class Enum {
constructor() {
this.innerEnum = {};
}
declare({ key, value, description, isFlag = false }) {
this.innerEnum[key] = {
key,
id: value,
description,
isFlag
};
this[key] = this.innerEnum[key];
return this;
};
getDescription(value) {
for (var prop in this.innerEnum) {
if (this.innerEnum[prop] ?.id === value) {
return this.innerEnum[prop].description;
}
}
return String.Empty;
};
getEnum(id) {
for (var prop in this.innerEnum) {
if (this.innerEnum[prop] ?.id === id) {
return this.innerEnum[prop];
}
}
return null;
};
toArray() {
var array = [];
var clone = { ...this.innerEnum };
for (var prop in clone) {
if (clone[prop].id && clone[prop].key) {
array.push(clone[prop]);
}
}
return array;
};
flag() {
var flag = 0;
for (var i = 0; i < arguments.length; i++) {
flag |= arguments[i].id;
}
return new Enum().declare('Custom', flag, String.Empty).Custom;
};
toFlagString(flag, separator) {
var names = Object.values(this.innerEnum).map(val => val.description);
var values = Object.values(this.innerEnum).map(val => val.id);
var retval = String.Empty;
var index = values.length - 1;
var firstTime = true;
var result = flag;
separator = separator || ';';
while (index >= 0) {
if ((index === 0) && (values[index] === 0))
break;
if ((result & values[index]) === values[index]) {
result -= values[index];
if (!firstTime) {
retval = retval.insertAt(0, separator);
}
retval = retval.insertAt(0, names[index]);
firstTime = false;
}
index--;
}
if (result !== 0) {
return String.Empty;
}
if (flag === 0) {
if (values.length > 0 && values[0] === 0)
return names[0];
else
return '0';
}
return retval;
};
flagToArray(flag) {
var values = Object.values(this.innerEnum).select(function (val) { return val.id; }).toArray();
var retval = [];
var index = 0;
var flagId = flag ? (flag.id || flag) : undefined;
while (values[index] <= flagId) {
var propEnum = this.getEnum(values[index]);
if ((flagId & values[index]) === values[index] && !propEnum.isFlag) {
retval.push(propEnum);
}
index++;
}
return retval;
};
getFlags(flag) {
var values = Object.values(this.innerEnum);
var valuesIds = values.map(val => val.id);
var index = valuesIds.length - 1;
var flags = [];
var result = flag;
while (index >= 0) {
if ((index === 0) && (valuesIds[index] === 0))
break;
if ((result & valuesIds[index]) === valuesIds[index]) {
result -= valuesIds[index];
flags.push(values[index]);
}
index--;
}
if (result !== 0) {
return [];
}
if (flag === 0) {
if (valuesIds.length > 0 && valuesIds[0] === 0)
return flag;
else
return 0;
}
return flags;
};
};
export default Enum;
const makeEnum = (enumName, enumData) => {
const newEnum = new Enum();
enumData.forEach(item => {
newEnum.declare(item);
});
Enums[enumName] = newEnum;
};
const Enums = {};
makeEnum('SortDirection', [
{ key: 'ASC', value: 1, description: 'Ascendente' },
{ key: 'DESC', value: 2, description: 'Descendente' }
]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment