summaryrefslogtreecommitdiffhomepage
path: root/app/lib/enum.js
blob: f436c741d00e735c94abe6855762fef4de64afc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
 * Enum
 * @exports
 * @class Enum
 */
export default class Enum {

  /**
   * Creates an instance of EnumBase.
   *
   * @param {...string|object} ... - enum keys
   * @memberOf Enum
   */
  constructor() {
    const items = [...arguments];
    let allKeys = [];
    let reverseMap = new Map();

    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: allKeys,
      writable: false
    });

    Object.defineProperty(this, 'reverseMap', {
      enumerable: false,
      value: reverseMap,
      writable: false
    });

    Object.freeze(this);
  }

  /**
   * Check if key is registered in this enum
   *
   * @param {string} key
   * @returns {bool}
   *
   * @memberOf 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);
  }
}