Last active
October 23, 2019 17:50
-
-
Save TiagoFuelber/072b6478e9bb951706935ef6826c7f73 to your computer and use it in GitHub Desktop.
Enum constructor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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