UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

100 lines (79 loc) 2.41 kB
import { assert } from "../../../assert.js"; import { BinaryDataType } from "../../../binary/type/BinaryDataType.js"; import { validate_enum_schema } from "../../../model/validate_enum_schema.js"; import { RowFirstTableSpec } from "../RowFirstTableSpec.js"; export class TableRecord { /** * * @type {Object<number>} */ #key_index = {}; /** * @type {Object<BinaryDataType>} */ #schema; /** * @type {RowFirstTable} */ #table; #row_index = 0; #value = new Proxy(this, { get: (target, property) => { // resolve property to index const keyIndex = this.#key_index[property]; if (keyIndex === undefined) { throw new Error(`Property '${property}' is not part of this schema`); } return this.#table.readCellValue(this.#row_index, keyIndex); }, set: (target, property, value) => { // resolve property to index const keyIndex = this.#key_index[property]; if (keyIndex === undefined) { throw new Error(`Property '${property}' is not part of this schema`); } this.#table.writeCellValue(this.#row_index, keyIndex, value); return true; } }) get value() { return this.#value; } set value(object) { this.set(object) } set(object) { for (const key in object) { this.#value[key] = object[key]; } } get() { return this.#value; } /** * * @param {Object} schema */ constructor(schema) { assert.notNull(schema, 'schema'); assert.defined(schema, 'schema'); assert.ok(validate_enum_schema(schema, BinaryDataType, console.warn), 'invalid schema'); this.#schema = schema; const keys = Object.keys(schema); for (let i = 0; i < keys.length; i++) { this.#key_index[keys[i]] = i; } } get table_schema() { return RowFirstTableSpec.get(Object.values(this.#schema)); } /** * * @param {RowFirstTable} table * @param {number} row_index */ bind(table, row_index) { this.#table = table; this.#row_index = row_index; } }