summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@codeispoetry.ru>2017-03-20 19:34:25 +0000
committerAndrej Mihajlov <and@codeispoetry.ru>2017-03-20 19:34:25 +0000
commit0586f3bd50adbb3a0e10dc7503820f0a140c573f (patch)
treeebcd863510789a0211f2a5d05f98b2c2f3364208
parent68ae67e39ffdd44287f91ef5955ec0480ec81f0a (diff)
downloadmullvadvpn-0586f3bd50adbb3a0e10dc7503820f0a140c573f.tar.xz
mullvadvpn-0586f3bd50adbb3a0e10dc7503820f0a140c573f.zip
- Add support for passing custom values for enum keys (via Object)
- Add support for reverse lookup in enum
-rw-r--r--app/lib/enum.js54
-rw-r--r--test/enum.spec.js12
2 files changed, 57 insertions, 9 deletions
diff --git a/app/lib/enum.js b/app/lib/enum.js
index a27bd37439..ac5df30d06 100644
--- a/app/lib/enum.js
+++ b/app/lib/enum.js
@@ -8,23 +8,47 @@ export default class Enum {
/**
* Creates an instance of EnumBase.
*
- * @param {...string} ... - enum keys
+ * @param {...string|object} ... - enum keys
* @memberOf Enum
*/
constructor() {
- const keys = [...arguments];
+ const items = [...arguments];
+ let allKeys = [];
+ let reverseMap = new Map();
- for(const key of keys) {
- Object.defineProperty(this, key, {
- enumerable: true,
- value: key,
- writable: false
- });
+ for(const item of items) {
+ if(typeof(item) === 'string') {
+ Object.defineProperty(this, item, {
+ enumerable: true,
+ value: item,
+ writable: false
+ });
+ allKeys.push(item);
+ reverseMap.set(item, item);
+ } else if(typeof(item) === 'object') {
+ for(const key of Object.keys(item)) {
+ Object.defineProperty(this, key, {
+ enumerable: true,
+ value: item[key],
+ writable: false
+ });
+ allKeys.push(key);
+ reverseMap.set(item[key], key);
+ }
+ } else {
+ throw new Error('Unsupported argument type: ' + typeof(item));
+ }
}
Object.defineProperty(this, 'allKeys', {
enumerable: false,
- value: keys,
+ value: allKeys,
+ writable: false
+ });
+
+ Object.defineProperty(this, 'reverseMap', {
+ enumerable: false,
+ value: reverseMap,
writable: false
});
@@ -42,5 +66,17 @@ export default class Enum {
isValid(key) {
return this.allKeys.includes(key);
}
+
+ /**
+ * Return key for value
+ *
+ * @param {any} value
+ * @returns {any|undefined} returns undefined if key is not found
+ *
+ * @memberOf Enum
+ */
+ reverse(value) {
+ return this.reverseMap.get(value);
+ }
}
diff --git a/test/enum.spec.js b/test/enum.spec.js
index 554a35b922..013fbc4e0f 100644
--- a/test/enum.spec.js
+++ b/test/enum.spec.js
@@ -25,4 +25,16 @@ describe('enum', () => {
const e = new Enum(...keys);
expect(Object.keys(e)).to.be.deep.equal(keys);
});
+
+ it('should do reverse lookup', () => {
+ const keys = { NORTH: 0, SOUTH: 1, WEST: 2, EAST: 3 };
+ const e = new Enum(keys);
+ expect(e.reverse(2)).to.be.equal('WEST');
+ });
+
+ it('should return undefined on reverse lookup failure', () => {
+ const keys = { NORTH: 0, SOUTH: 1, WEST: 2, EAST: 3 };
+ const e = new Enum(keys);
+ expect(e.reverse(1337)).to.be.undefined;
+ });
});