diff --git a/config-serializer/ClassArray.ts b/config-serializer/ClassArray.ts new file mode 100644 index 00000000..1bf2abd4 --- /dev/null +++ b/config-serializer/ClassArray.ts @@ -0,0 +1,47 @@ +abstract class ClassArray extends Serializable { + + elements: Serializable[] = []; + + _fromJsObject(jsObjects: any): Serializable { + for (let jsObject of jsObjects) { + this.elements.push(this.jsObjectToClass(jsObject)); + } + return this; + } + + _fromBinary(buffer: UhkBuffer): Serializable { + let arrayLength = buffer.readCompactLength(); + for (let i = 0; i < arrayLength; i++) { + this.elements.push(this.binaryToClass(buffer)); + } + return this; + } + + _toJsObject(): any { + let array = []; + for (let element of this.elements) { + array.push(element.toJsObject()); + } + return array; + } + + _toBinary(buffer: UhkBuffer) { + buffer.writeCompactLength(this.elements.length); + + if (buffer.enableDump) { + process.stdout.write(']\n'); + buffer.enableDump = false; + } + + for (let element of this.elements) { + element.toBinary(buffer); + } + } + + toString(): string { + return `<${this.constructor.name} length="${this.elements.length}">`; + } + + abstract jsObjectToClass(jsObject: any): Serializable; + abstract binaryToClass(buffer: UhkBuffer): Serializable; +} diff --git a/config-serializer/Serializable.ts b/config-serializer/Serializable.ts index 647dc973..a185bebd 100644 --- a/config-serializer/Serializable.ts +++ b/config-serializer/Serializable.ts @@ -14,9 +14,9 @@ abstract class Serializable { : json; } - fromJsObject(jsObject: any): T { + fromJsObject(jsObject: any): Serializable { let indentation = new Array(Serializable.depth + 1).join(' '); - let isArray = this instanceof UhkArray; + let isArray = this instanceof ClassArray; process.stdout.write(`${indentation}${this.constructor.name}.fromJsObject: ${this.strintifyJsObject(jsObject)}` + (isArray ? '\n' : ` => `)); Serializable.depth++; let value = this._fromJsObject(jsObject); @@ -27,9 +27,9 @@ abstract class Serializable { return value; } - fromBinary(buffer: UhkBuffer): T { + fromBinary(buffer: UhkBuffer): Serializable { let indentation = new Array(Serializable.depth + 1).join(' '); - let isArray = this instanceof UhkArray; + let isArray = this instanceof ClassArray; process.stdout.write(`${indentation}${this.constructor.name}.fromBinary:` + (isArray ? '\n' : ' [')); Serializable.depth++; buffer.enableDump = !isArray; @@ -44,7 +44,7 @@ abstract class Serializable { toJsObject(): any { let indentation = new Array(Serializable.depth + 1).join(' '); - let isArray = this instanceof UhkArray; + let isArray = this instanceof ClassArray; process.stdout.write(`${indentation}${this.constructor.name}.toJsObject: ${this}` + (isArray ? '\n' : ` => `)); Serializable.depth++; let value = this._toJsObject(); @@ -57,10 +57,10 @@ abstract class Serializable { toBinary(buffer: UhkBuffer): void { let indentation = new Array(Serializable.depth + 1).join(' '); - let isArray = this instanceof UhkArray; - process.stdout.write(`${indentation}${this.constructor.name}.toBinary: ${this}` + (isArray ? '\n' : ' => [')); + let isArray = this instanceof ClassArray; + process.stdout.write(`${indentation}${this.constructor.name}.toBinary: ${this} => ['`); Serializable.depth++; - buffer.enableDump = !isArray; + buffer.enableDump = true; let value = this._toBinary(buffer); buffer.enableDump = false; Serializable.depth--; @@ -70,8 +70,8 @@ abstract class Serializable { return value; } - abstract _fromJsObject(jsObject: any): T; - abstract _fromBinary(buffer: UhkBuffer): T; + abstract _fromJsObject(jsObject: any): Serializable; + abstract _fromBinary(buffer: UhkBuffer): Serializable; abstract _toJsObject(): any; abstract _toBinary(buffer: UhkBuffer): void; } diff --git a/config-serializer/UhkArray.ts b/config-serializer/UhkArray.ts deleted file mode 100644 index 1cc92318..00000000 --- a/config-serializer/UhkArray.ts +++ /dev/null @@ -1,6 +0,0 @@ -abstract class UhkArray extends Serializable { - abstract _fromJsObject(jsObject: any): T; - abstract _fromBinary(buffer: UhkBuffer): T; - abstract _toJsObject(): any; - abstract _toBinary(buffer: UhkBuffer): void; -} diff --git a/config-serializer/config-items/KeyActionFactory.ts b/config-serializer/config-items/KeyActionFactory.ts index 2461f36f..0f261843 100644 --- a/config-serializer/config-items/KeyActionFactory.ts +++ b/config-serializer/config-items/KeyActionFactory.ts @@ -1,6 +1,6 @@ -class KeyActionFactory { +class KeyActionFactory implements SubclassFactory { - static fromJsObject(jsObject: any): KeyAction { + fromJsObject(jsObject: any): KeyAction { switch (jsObject.keyActionType) { case KeyActionType.NoneAction: return new NoneAction().fromJsObject(jsObject); @@ -23,7 +23,7 @@ class KeyActionFactory { } } - static fromBinary(buffer: UhkBuffer): KeyAction { + fromBinary(buffer: UhkBuffer): KeyAction { let keyActionFirstByte = buffer.readUInt8(); buffer.backtrack(); diff --git a/config-serializer/config-items/KeyActions.ts b/config-serializer/config-items/KeyActions.ts index e2516e5f..91f75d49 100644 --- a/config-serializer/config-items/KeyActions.ts +++ b/config-serializer/config-items/KeyActions.ts @@ -1,38 +1,51 @@ -class KeyActions extends UhkArray { +class KeyActions extends ClassArray { - keyActions: Serializable[] = []; - - _fromJsObject(jsObjects: any): KeyActions { - for (let jsObject of jsObjects) { - this.keyActions.push(KeyActionFactory.fromJsObject(jsObject)); - } - return this; - } - - _fromBinary(buffer: UhkBuffer): KeyActions { - let arrayLength = buffer.readCompactLength(); - for (let i = 0; i < arrayLength; i++) { - this.keyActions.push(KeyActionFactory.fromBinary(buffer)); - } - return this; - } - - _toJsObject(): any { - let array = []; - for (let keyAction of this.keyActions) { - array.push(keyAction.toJsObject()); - } - return array; - } - - _toBinary(buffer: UhkBuffer) { - buffer.writeCompactLength(this.keyActions.length); - for (let keyAction of this.keyActions) { - keyAction.toBinary(buffer); + jsObjectToClass(jsObject: any): Serializable { + switch (jsObject.keyActionType) { + case KeyActionType.NoneAction: + return new NoneAction().fromJsObject(jsObject); + case KeyActionType.KeystrokeAction: + return new KeystrokeAction().fromJsObject(jsObject); + case KeyActionType.KeystrokeWithModifiersAction: + return new KeystrokeWithModifiersAction().fromJsObject(jsObject); + case KeyActionType.DualRoleKeystrokeAction: + return new DualRoleKeystrokeAction().fromJsObject(jsObject); + case KeyActionType.SwitchLayerAction: + return new SwitchLayerAction().fromJsObject(jsObject); + case KeyActionType.SwitchKeymapAction: + return new SwitchKeymapAction().fromJsObject(jsObject); + case KeyActionType.MouseAction: + return new MouseAction().fromJsObject(jsObject); + case KeyActionType.PlayMacroAction: + return new PlayMacroAction().fromJsObject(jsObject); + default: + throw `Invalid KeyAction.keyActionType: "${jsObject.actionType}"`; } } - toString(): string { - return ``; + binaryToClass(buffer: UhkBuffer): Serializable { + let keyActionFirstByte = buffer.readUInt8(); + buffer.backtrack(); + + switch (keyActionFirstByte) { + case KeyActionId.NoneAction: + return new NoneAction().fromBinary(buffer); + case KeyActionId.KeystrokeAction: + return new KeystrokeAction().fromBinary(buffer); + case KeyActionId.KeystrokeWithModifiersAction: + return new KeystrokeWithModifiersAction().fromBinary(buffer); + case KeyActionId.DualRoleKeystrokeAction: + return new DualRoleKeystrokeAction().fromBinary(buffer); + case KeyActionId.SwitchLayerAction: + return new SwitchLayerAction().fromBinary(buffer); + case KeyActionId.SwitchKeymapAction: + return new SwitchKeymapAction().fromBinary(buffer); + case KeyActionId.MouseAction: + return new MouseAction().fromBinary(buffer); + case KeyActionId.PlayMacroAction: + return new PlayMacroAction().fromBinary(buffer); + default: + throw `Invalid KeyAction first byte: ${keyActionFirstByte}`; + } } } diff --git a/config-serializer/config-items/config-items.ts b/config-serializer/config-items/config-items.ts index c41f2af7..f9d47ebe 100644 --- a/config-serializer/config-items/config-items.ts +++ b/config-serializer/config-items/config-items.ts @@ -1,5 +1,4 @@ /// -/// /// /// /// diff --git a/config-serializer/test-serializer.ts b/config-serializer/test-serializer.ts index 759100b0..3b92283e 100644 --- a/config-serializer/test-serializer.ts +++ b/config-serializer/test-serializer.ts @@ -1,7 +1,7 @@ /// /// /// -/// +/// /// /// @@ -11,7 +11,7 @@ let fs = require('fs'); let uhkConfig = JSON.parse(fs.readFileSync('uhk-config.json')); let keyActions1Js = uhkConfig.keymaps[0].layers[0].modules[0].keyActions; -let keyActions1Ts: KeyActions = new KeyActions().fromJsObject(keyActions1Js); +let keyActions1Ts: Serializable = new KeyActions().fromJsObject(keyActions1Js); let keyActions1Buffer = new UhkBuffer(); keyActions1Ts.toBinary(keyActions1Buffer); let keyActions1BufferContent = keyActions1Buffer.getBufferContent();