UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

89 lines (69 loc) 3.41 kB
import {System} from "./System.js"; /** * Utility method for making sure that the system is properly constructed, used internally by the engine itself * @param {System} system * @throws if system fails validation */ export function validateSystem(system) { if (system === undefined) { throw new Error("System is undefined"); } if (system === null) { throw new Error("System is null"); } if (!(system instanceof System)) { throw new TypeError("System does not inherit from \"System\" class"); } if (typeof system.add === "function") { throw new Error(`uses deprecated 'add' method, should use 'link' instead`); } if (typeof system.remove === "function") { throw new Error(`uses deprecated 'remove' method, should use 'unlink' instead`); } // validate 'components_used' section const components_used = system.components_used; const components_used_count = components_used.length; for (let i = 0; i < components_used_count; i++) { const spec = components_used[i]; if (spec === undefined || spec === null || spec.isResourceAccessSpecification !== true) { throw new Error(`Invalid access specification[${i}], expected an instance of ResourceAccessSpecification, but got something else`); } if (spec.resource === null) { throw new Error(`No component specified for element [${i}]`); } if (spec.access === 0) { throw new Error('No access modifiers specified, must have at least one (such as Read, Write, Create)'); } // backtrace to make sure there are no duplicates for (let j = 0; j < i - 1; j++) { const spec_other = components_used[j]; if (spec_other.resource === spec.resource) { throw new Error(`Duplicate specification of component [${j}] and [${i}]`); } } } //validate dependencies const dependencies = system.dependencies; const numDependencies = dependencies.length; if (numDependencies < 1) { throw new Error(`A system must declare at least one dependency`); } if (numDependencies > 1) { //check for duplicates for (let i = 0; i < numDependencies; i++) { const dependencyA = dependencies[i]; for (let j = i + 1; j < numDependencies; j++) { if (dependencyA === dependencies[j]) { throw new Error(`Detected duplicate dependency: ${dependencyA.constructor.typeName}`); } } } } const linkArgumentCount = numDependencies + 1; if (system.link !== System.prototype.link && system.link.length !== linkArgumentCount && system.__validation_ignore_link_argument_count !== true) { throw new Error(`'link' method declares ${system.link.length} instead of expected ${linkArgumentCount} based on it's ${numDependencies} dependencies`); } if (system.unlink !== System.prototype.unlink && system.unlink.length !== linkArgumentCount && system.__validation_ignore_link_argument_count !== true) { throw new Error(`'unlink' method declares ${system.unlink.length} instead of expected ${linkArgumentCount} based on it's ${numDependencies} dependencies`); } }