From 6e218387fcf67255ef92045b7fadc23369586acb Mon Sep 17 00:00:00 2001 From: Sam Rang Date: Mon, 9 May 2016 12:17:54 -0500 Subject: [PATCH] changing how assertions access instance variables to make them non-static-like (#37) Changing how assertions access instance variables --- config-serializer/assert.ts | 90 ++++++++++--------- .../config-items/DelayMacroAction.ts | 3 +- .../config-items/DualRoleKeystrokeAction.ts | 5 +- .../config-items/HoldKeyMacroAction.ts | 3 +- .../config-items/HoldModifiersMacroAction.ts | 3 +- .../HoldMouseButtonsMacroAction.ts | 3 +- config-serializer/config-items/KeyMap.ts | 3 +- .../config-items/KeystrokeAction.ts | 3 +- .../config-items/KeystrokeModifiersAction.ts | 3 +- .../KeystrokeWithModifiersAction.ts | 5 +- config-serializer/config-items/Macro.ts | 3 +- config-serializer/config-items/Module.ts | 5 +- .../config-items/ModuleConfiguration.ts | 9 +- config-serializer/config-items/MouseAction.ts | 3 +- .../config-items/MoveMouseMacroAction.ts | 5 +- .../config-items/PlayMacroAction.ts | 3 +- .../config-items/PressKeyMacroAction.ts | 3 +- .../config-items/PressModifiersMacroAction.ts | 3 +- .../PressMouseButtonsMacroAction.ts | 3 +- .../config-items/ReleaseKeyMacroAction.ts | 3 +- .../ReleaseModifiersMacroAction.ts | 3 +- .../ReleaseMouseButtonsMacroAction.ts | 3 +- .../config-items/ScrollMouseMacroAction.ts | 5 +- .../config-items/SwitchKeymapAction.ts | 3 +- .../config-items/SwitchLayerAction.ts | 3 +- .../config-items/UhkConfiguration.ts | 11 +-- 26 files changed, 112 insertions(+), 77 deletions(-) diff --git a/config-serializer/assert.ts b/config-serializer/assert.ts index 0328d8b6..a0560a4c 100644 --- a/config-serializer/assert.ts +++ b/config-serializer/assert.ts @@ -1,68 +1,78 @@ -function assertUInt8(target: any, key: string) { +export function assertUInt8(target: any, key: string) { return assertInteger(target, key, 0, 0xFF); } -function assertInt8(target: any, key: string) { +export function assertInt8(target: any, key: string) { return assertInteger(target, key, -0x80, 0x7F); } -function assertUInt16(target: any, key: string) { +export function assertUInt16(target: any, key: string) { return assertInteger(target, key, 0, 0xFFFF); } -function assertInt16(target: any, key: string) { +export function assertInt16(target: any, key: string) { return assertInteger(target, key, -0x8000, 0x7FFF); } -function assertUInt32(target: any, key: string) { +export function assertUInt32(target: any, key: string) { return assertInteger(target, key, 0, 0xFFFFFFFF); } -function assertInt32(target: any, key: string) { +export function assertInt32(target: any, key: string) { return assertInteger(target, key, -0x80000000, 0x7FFFFFFF); } -function assertCompactLength(target: any, key: string) { +export function assertCompactLength(target: any, key: string) { return assertUInt16(target, key); } function assertInteger(target: any, key: string, min: number, max: number) { - let val = this[key]; - if (delete this[key]) { - Object.defineProperty(target, key, { - get: function () { - return val; - }, - set: function (newVal) { - if (newVal < min || newVal > max) { - throw `${target.constructor.name}.${key}: ` + - `Integer ${newVal} is outside the valid [${min}, ${max}] interval`; + const priv = '_' + key; + + function getter() { + return this[priv]; + } + + function setter(newVal: any) { + if (this[priv] !== newVal) { + if (newVal < min || newVal > max) { + throw `${target.constructor.name}.${key}: ` + + `Integer ${newVal} is outside the valid [${min}, ${max}] interval`; + } + this[priv] = newVal; + } + } + + Object.defineProperty(target, key, { + get: getter, + set: setter, + enumerable: true, + configurable: true + }); +} + +export function assertEnum(enumerated: E) { + return function(target: any, key: string) { + const priv = '_' + key; + + function getter() { + return this[priv]; + } + + function setter(newVal: any) { + if (this[priv] !== newVal) { + if (enumerated[newVal] === undefined) { + throw `${target.constructor.name}.${key}: ${newVal} is not enum`; } - val = newVal; - }, + this[priv] = newVal; + } + } + + Object.defineProperty(target, key, { + get: getter, + set: setter, enumerable: true, configurable: true }); - } -} - -function assertEnum(enumerated: E) { - return function(target: any, key: string) { - let val = this[key]; - if (delete this[key]) { - Object.defineProperty(target, key, { - get: function () { - return val; - }, - set: function (newVal) { - if (enumerated[newVal] === undefined) { - throw `${target.constructor.name}.${key}: ${newVal} is not enum`; - } - val = newVal; - }, - enumerable: true, - configurable: true - }); - } }; } diff --git a/config-serializer/config-items/DelayMacroAction.ts b/config-serializer/config-items/DelayMacroAction.ts index 9f21744d..7e1c06e1 100644 --- a/config-serializer/config-items/DelayMacroAction.ts +++ b/config-serializer/config-items/DelayMacroAction.ts @@ -1,9 +1,10 @@ import {UhkBuffer} from '../UhkBuffer'; import {MacroAction, macroActionType, MacroActionId} from './MacroAction'; +import {assertUInt16} from '../assert'; export class DelayMacroAction extends MacroAction { - // @assertUInt16 + @assertUInt16 delay: number; _fromJsObject(jsObject: any): DelayMacroAction { diff --git a/config-serializer/config-items/DualRoleKeystrokeAction.ts b/config-serializer/config-items/DualRoleKeystrokeAction.ts index 721c43f2..4e157d1c 100644 --- a/config-serializer/config-items/DualRoleKeystrokeAction.ts +++ b/config-serializer/config-items/DualRoleKeystrokeAction.ts @@ -1,5 +1,6 @@ import {UhkBuffer} from '../UhkBuffer'; import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; +import {assertUInt8, assertEnum} from '../assert'; enum LongPressAction { leftCtrl, @@ -17,10 +18,10 @@ enum LongPressAction { export class DualRoleKeystrokeAction extends KeyAction { - // @assertUInt8 + @assertUInt8 scancode: number; - // @assertEnum(LongPressAction) + @assertEnum(LongPressAction) private longPressAction: LongPressAction; _fromJsObject(jsObject: any): DualRoleKeystrokeAction { diff --git a/config-serializer/config-items/HoldKeyMacroAction.ts b/config-serializer/config-items/HoldKeyMacroAction.ts index 916048b5..53ea4b78 100644 --- a/config-serializer/config-items/HoldKeyMacroAction.ts +++ b/config-serializer/config-items/HoldKeyMacroAction.ts @@ -1,9 +1,10 @@ import {UhkBuffer} from '../UhkBuffer'; import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; +import {assertUInt8} from '../assert'; export class HoldKeyMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 scancode: number; _fromJsObject(jsObject: any): HoldKeyMacroAction { diff --git a/config-serializer/config-items/HoldModifiersMacroAction.ts b/config-serializer/config-items/HoldModifiersMacroAction.ts index fe09d42c..3a5d91a8 100644 --- a/config-serializer/config-items/HoldModifiersMacroAction.ts +++ b/config-serializer/config-items/HoldModifiersMacroAction.ts @@ -1,9 +1,10 @@ import {UhkBuffer} from '../UhkBuffer'; import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; +import {assertUInt8} from '../assert'; export class HoldModifiersMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 modifierMask: number; _fromJsObject(jsObject: any): HoldModifiersMacroAction { diff --git a/config-serializer/config-items/HoldMouseButtonsMacroAction.ts b/config-serializer/config-items/HoldMouseButtonsMacroAction.ts index 65e97728..78a3307f 100644 --- a/config-serializer/config-items/HoldMouseButtonsMacroAction.ts +++ b/config-serializer/config-items/HoldMouseButtonsMacroAction.ts @@ -1,9 +1,10 @@ import {UhkBuffer} from '../UhkBuffer'; import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; +import {assertUInt8} from '../assert'; export class HoldMouseButtonsMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 mouseButtonsMask: number; _fromJsObject(jsObject: any): HoldMouseButtonsMacroAction { diff --git a/config-serializer/config-items/KeyMap.ts b/config-serializer/config-items/KeyMap.ts index 20d9e5fd..014a33e7 100644 --- a/config-serializer/config-items/KeyMap.ts +++ b/config-serializer/config-items/KeyMap.ts @@ -1,10 +1,11 @@ import {Serializable} from '../Serializable'; import {UhkBuffer} from '../UhkBuffer'; import {Layers} from './Layers'; +import {assertUInt8} from '../assert'; export class KeyMap extends Serializable { - // @assertUInt8 + @assertUInt8 id: number; name: string; diff --git a/config-serializer/config-items/KeystrokeAction.ts b/config-serializer/config-items/KeystrokeAction.ts index f1c5f0b3..1159b161 100644 --- a/config-serializer/config-items/KeystrokeAction.ts +++ b/config-serializer/config-items/KeystrokeAction.ts @@ -1,9 +1,10 @@ import {UhkBuffer} from '../UhkBuffer'; import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; +import {assertUInt8} from '../assert'; export class KeystrokeAction extends KeyAction { - // @assertUInt8 + @assertUInt8 scancode: number; _fromJsObject(jsObject: any): KeystrokeAction { diff --git a/config-serializer/config-items/KeystrokeModifiersAction.ts b/config-serializer/config-items/KeystrokeModifiersAction.ts index 7704342b..f254f8e0 100644 --- a/config-serializer/config-items/KeystrokeModifiersAction.ts +++ b/config-serializer/config-items/KeystrokeModifiersAction.ts @@ -1,5 +1,6 @@ import {UhkBuffer} from '../UhkBuffer'; import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; +import {assertUInt8} from '../assert'; export enum KeyModifiers { leftCtrl = 1 << 0, @@ -14,7 +15,7 @@ export enum KeyModifiers { export class KeystrokeModifiersAction extends KeyAction { - // @assertUInt8 + @assertUInt8 modifierMask: number; _fromJsObject(jsObject: any): KeystrokeModifiersAction { diff --git a/config-serializer/config-items/KeystrokeWithModifiersAction.ts b/config-serializer/config-items/KeystrokeWithModifiersAction.ts index c2cf60ce..9ae59cf7 100644 --- a/config-serializer/config-items/KeystrokeWithModifiersAction.ts +++ b/config-serializer/config-items/KeystrokeWithModifiersAction.ts @@ -1,13 +1,14 @@ import {UhkBuffer} from '../UhkBuffer'; import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; import {KeyModifiers} from './KeystrokeModifiersAction'; +import {assertUInt8} from '../assert'; export class KeystrokeWithModifiersAction extends KeyAction { - // @assertUInt8 + @assertUInt8 modifierMask: number; - // @assertUInt8 + @assertUInt8 scancode: number; _fromJsObject(jsObject: any): KeystrokeWithModifiersAction { diff --git a/config-serializer/config-items/Macro.ts b/config-serializer/config-items/Macro.ts index 18c522f3..ef855394 100644 --- a/config-serializer/config-items/Macro.ts +++ b/config-serializer/config-items/Macro.ts @@ -1,10 +1,11 @@ import {Serializable} from '../Serializable'; import {UhkBuffer} from '../UhkBuffer'; import {MacroActions} from './MacroActions'; +import {assertUInt8} from '../assert'; export class Macro extends Serializable { - // @assertUInt8 + @assertUInt8 id: number; isLooped: boolean; diff --git a/config-serializer/config-items/Module.ts b/config-serializer/config-items/Module.ts index bdb861b9..ddd3c28e 100644 --- a/config-serializer/config-items/Module.ts +++ b/config-serializer/config-items/Module.ts @@ -1,6 +1,7 @@ import {Serializable} from '../Serializable'; import {KeyActions} from './KeyActions'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8, assertEnum} from '../assert'; enum PointerRole { none, @@ -10,12 +11,12 @@ enum PointerRole { export class Module extends Serializable { - // @assertUInt8 + @assertUInt8 id: number; keyActions: KeyActions; - // @assertEnum(PointerRole) + @assertEnum(PointerRole) private pointerRole: PointerRole; _fromJsObject(jsObject: any): Module { diff --git a/config-serializer/config-items/ModuleConfiguration.ts b/config-serializer/config-items/ModuleConfiguration.ts index 5106b74e..d6c3622d 100644 --- a/config-serializer/config-items/ModuleConfiguration.ts +++ b/config-serializer/config-items/ModuleConfiguration.ts @@ -1,5 +1,6 @@ import {Serializable} from '../Serializable'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class ModuleConfiguration extends Serializable { @@ -7,16 +8,16 @@ export class ModuleConfiguration extends Serializable { * module id enumeration is a separate story */ - // @assertUInt8 + @assertUInt8 id: number; - // @assertUInt8 + @assertUInt8 initialPointerSpeed: number; - // @assertUInt8 + @assertUInt8 pointerAcceleration: number; - // @assertUInt8 + @assertUInt8 maxPointerSpeed: number; _fromJsObject(jsObject: any): ModuleConfiguration { diff --git a/config-serializer/config-items/MouseAction.ts b/config-serializer/config-items/MouseAction.ts index 52e399bb..ebd2c3d5 100644 --- a/config-serializer/config-items/MouseAction.ts +++ b/config-serializer/config-items/MouseAction.ts @@ -1,5 +1,6 @@ import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertEnum} from '../assert'; enum MouseActionParam { leftClick, @@ -19,7 +20,7 @@ enum MouseActionParam { export class MouseAction extends KeyAction { - // @assertUInt8 + @assertEnum(MouseActionParam) mouseAction: MouseActionParam; _fromJsObject(jsObject: any): MouseAction { diff --git a/config-serializer/config-items/MoveMouseMacroAction.ts b/config-serializer/config-items/MoveMouseMacroAction.ts index 877c31cd..efc14928 100644 --- a/config-serializer/config-items/MoveMouseMacroAction.ts +++ b/config-serializer/config-items/MoveMouseMacroAction.ts @@ -1,12 +1,13 @@ import {MacroAction, macroActionType, MacroActionId} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertInt16} from '../assert'; export class MoveMouseMacroAction extends MacroAction { - // @assertInt16 + @assertInt16 x: number; - // @assertInt16 + @assertInt16 y: number; _fromJsObject(jsObject: any): MoveMouseMacroAction { diff --git a/config-serializer/config-items/PlayMacroAction.ts b/config-serializer/config-items/PlayMacroAction.ts index 0e863ffc..46240546 100644 --- a/config-serializer/config-items/PlayMacroAction.ts +++ b/config-serializer/config-items/PlayMacroAction.ts @@ -1,9 +1,10 @@ import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class PlayMacroAction extends KeyAction { - // @assertUInt8 + @assertUInt8 macroId: number; _fromJsObject(jsObject: any): PlayMacroAction { diff --git a/config-serializer/config-items/PressKeyMacroAction.ts b/config-serializer/config-items/PressKeyMacroAction.ts index 22eb282c..8facc427 100644 --- a/config-serializer/config-items/PressKeyMacroAction.ts +++ b/config-serializer/config-items/PressKeyMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class PressKeyMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 scancode: number; _fromJsObject(jsObject: any): PressKeyMacroAction { diff --git a/config-serializer/config-items/PressModifiersMacroAction.ts b/config-serializer/config-items/PressModifiersMacroAction.ts index 2d09fc99..b41001b3 100644 --- a/config-serializer/config-items/PressModifiersMacroAction.ts +++ b/config-serializer/config-items/PressModifiersMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class PressModifiersMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 modifierMask: number; _fromJsObject(jsObject: any): PressModifiersMacroAction { diff --git a/config-serializer/config-items/PressMouseButtonsMacroAction.ts b/config-serializer/config-items/PressMouseButtonsMacroAction.ts index 4dfb6dbc..b7d1e1be 100644 --- a/config-serializer/config-items/PressMouseButtonsMacroAction.ts +++ b/config-serializer/config-items/PressMouseButtonsMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class PressMouseButtonsMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 mouseButtonsMask: number; _fromJsObject(jsObject: any): PressMouseButtonsMacroAction { diff --git a/config-serializer/config-items/ReleaseKeyMacroAction.ts b/config-serializer/config-items/ReleaseKeyMacroAction.ts index 439b43ac..2be767c5 100644 --- a/config-serializer/config-items/ReleaseKeyMacroAction.ts +++ b/config-serializer/config-items/ReleaseKeyMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class ReleaseKeyMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 scancode: number; _fromJsObject(jsObject: any): ReleaseKeyMacroAction { diff --git a/config-serializer/config-items/ReleaseModifiersMacroAction.ts b/config-serializer/config-items/ReleaseModifiersMacroAction.ts index 3853e6a8..f9121be4 100644 --- a/config-serializer/config-items/ReleaseModifiersMacroAction.ts +++ b/config-serializer/config-items/ReleaseModifiersMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class ReleaseModifiersMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 modifierMask: number; _fromJsObject(jsObject: any): ReleaseModifiersMacroAction { diff --git a/config-serializer/config-items/ReleaseMouseButtonsMacroAction.ts b/config-serializer/config-items/ReleaseMouseButtonsMacroAction.ts index d27314c7..c9831d4c 100644 --- a/config-serializer/config-items/ReleaseMouseButtonsMacroAction.ts +++ b/config-serializer/config-items/ReleaseMouseButtonsMacroAction.ts @@ -1,9 +1,10 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class ReleaseMouseButtonsMacroAction extends MacroAction { - // @assertUInt8 + @assertUInt8 mouseButtonsMask: number; _fromJsObject(jsObject: any): ReleaseMouseButtonsMacroAction { diff --git a/config-serializer/config-items/ScrollMouseMacroAction.ts b/config-serializer/config-items/ScrollMouseMacroAction.ts index 2b1a0a27..4861d65c 100644 --- a/config-serializer/config-items/ScrollMouseMacroAction.ts +++ b/config-serializer/config-items/ScrollMouseMacroAction.ts @@ -1,12 +1,13 @@ import {MacroAction, MacroActionId, macroActionType} from './MacroAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertInt16} from '../assert'; export class ScrollMouseMacroAction extends MacroAction { - // @assertInt16 + @assertInt16 x: number; - // @assertInt16 + @assertInt16 y: number; _fromJsObject(jsObject: any): ScrollMouseMacroAction { diff --git a/config-serializer/config-items/SwitchKeymapAction.ts b/config-serializer/config-items/SwitchKeymapAction.ts index 1160eb09..c3461c0a 100644 --- a/config-serializer/config-items/SwitchKeymapAction.ts +++ b/config-serializer/config-items/SwitchKeymapAction.ts @@ -1,9 +1,10 @@ import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8} from '../assert'; export class SwitchKeymapAction extends KeyAction { - // @assertUInt8 + @assertUInt8 keymapId: number; _fromJsObject(jsObject: any): SwitchKeymapAction { diff --git a/config-serializer/config-items/SwitchLayerAction.ts b/config-serializer/config-items/SwitchLayerAction.ts index cc76d4ab..77aed826 100644 --- a/config-serializer/config-items/SwitchLayerAction.ts +++ b/config-serializer/config-items/SwitchLayerAction.ts @@ -1,5 +1,6 @@ import {keyActionType, KeyActionId, KeyAction} from './KeyAction'; import {UhkBuffer} from '../UhkBuffer'; +import {assertEnum} from '../assert'; export enum LayerName { mod, @@ -11,7 +12,7 @@ export class SwitchLayerAction extends KeyAction { isLayerToggleable: boolean; - // @assertEnum(LayerName) + @assertEnum(LayerName) private _layer: LayerName; _fromJsObject(jsObject: any): SwitchLayerAction { diff --git a/config-serializer/config-items/UhkConfiguration.ts b/config-serializer/config-items/UhkConfiguration.ts index f7be5a73..9573e0e3 100644 --- a/config-serializer/config-items/UhkConfiguration.ts +++ b/config-serializer/config-items/UhkConfiguration.ts @@ -3,21 +3,22 @@ import {ModuleConfigurations} from './ModuleConfigurations'; import {KeyMaps} from './KeyMaps'; import {Macros} from './Macros'; import {UhkBuffer} from '../UhkBuffer'; +import {assertUInt8, assertUInt32} from '../assert'; export class UhkConfiguration extends Serializable { signature: string; - // @assertUInt8 + @assertUInt8 dataModelVersion: number; - // @assertUInt32 + @assertUInt32 prologue: number; - // @assertUInt8 + @assertUInt8 hardwareId: number; - // @assertUInt8 + @assertUInt8 brandId: number; moduleConfigurations: ModuleConfigurations; @@ -26,7 +27,7 @@ export class UhkConfiguration extends Serializable { macros: Macros; - // @assertUInt32 + @assertUInt32 epilogue: number; _fromJsObject(jsObject: any): UhkConfiguration {