diff options
| author | Andrej Mihajlov <and@codeispoetry.ru> | 2017-03-20 19:34:25 +0000 |
|---|---|---|
| committer | Andrej Mihajlov <and@codeispoetry.ru> | 2017-03-20 19:34:25 +0000 |
| commit | 0586f3bd50adbb3a0e10dc7503820f0a140c573f (patch) | |
| tree | ebcd863510789a0211f2a5d05f98b2c2f3364208 | |
| parent | 68ae67e39ffdd44287f91ef5955ec0480ec81f0a (diff) | |
| download | mullvadvpn-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.js | 54 | ||||
| -rw-r--r-- | test/enum.spec.js | 12 |
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; + }); }); |
