@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
217 lines • 17.4 kB
JavaScript
export function isObject(data) {
if (!data)
return false;
if (Array.isArray(data))
return false;
return typeof data === "object";
}
export function isString(data) {
return typeof data === "string";
}
export function isNumber(data) {
return typeof data === "number";
}
export function isBoolean(data) {
return typeof data === "boolean";
}
export function isArrayBuffer(data) {
if (!data)
return false;
return data instanceof ArrayBuffer;
}
export function isStringArray(data) {
if (!Array.isArray(data))
return false;
for (const item of data) {
if (!isString(item))
return false;
}
return true;
}
export function assertNumber(data, name = "data") {
if (!isNumber(data)) {
throw new TypeError(`${name} was expected to be a number but we got ${typeof data}!`);
}
}
export function assertString(data, name = "data") {
if (!isString(data)) {
throw new TypeError(`${name} was expected to be a string but we got ${typeof data}!`);
}
}
export function assertOptionalString(data, name = "data") {
if (data && !isString(data)) {
throw new TypeError(`${name} was expected to be a string but we got ${typeof data}!`);
}
}
export function assertBoolean(data, name = "data") {
if (!isBoolean(data)) {
throw new TypeError(`${name} was expected to be a boolean but we got ${typeof data}!`);
}
}
export function assertObject(data, name = "data") {
if (!isObject(data)) {
throw new TypeError(`${name} was expected to be an object but we got ${typeof data}!`);
}
}
export function assertArray(data, name = "data") {
if (!Array.isArray(data)) {
throw new TypeError(`${name} was expected to be an Array but we got ${typeof data}!`);
}
}
export function assertArrayBuffer(data, name = "data") {
if (!isArrayBuffer(data)) {
throw new TypeError(`${name} was expected to be an ArrayBuffer but we got ${typeof data}!`);
}
}
export function assertOptionalArrayBuffer(data, name = "data") {
if (data && !isArrayBuffer(data)) {
throw new TypeError(`${name} was expected to be an ArrayBuffer but we got ${typeof data}!`);
}
}
export function isType(data, type) {
try {
assertType(data, type);
return true;
}
catch (_a) {
return false;
}
}
export function assertType(data, type, prefix = "data") {
if (type === "unknown")
return;
if (type === "null") {
if (data !== null) {
throw new TypeError(`Expected ${prefix} to be null and not a ${typeof data}!`);
}
return;
}
if (typeof type === "string") {
if (typeof data !== type) {
throw new TypeError(`Expected ${prefix} to be a ${type} and not a ${typeof data}!`);
}
return;
}
if (Array.isArray(type)) {
const [kind] = type;
switch (kind) {
case "array":
assertTypeArray(data, prefix, type);
return;
case "map":
assertTypeMap(data, prefix, type);
return;
case "?":
assertTypeOptional(data, prefix, type);
return;
case "|":
assertTypeAlternative(data, prefix, type);
return;
case "tuple":
assertTypeTuple(data, prefix, type);
return;
case "partial":
assertTypePartial(data, prefix, type);
return;
case "literal":
assertTypeLiteral(data, prefix, type);
return;
default:
if (kind.startsWith("array(")) {
const size = Number.parseInt(kind.slice("array(".length, -1), 10);
assertTypeArrayWithDimension(data, prefix, type, size);
return;
}
throw new TypeError(`Don't know how to create a type guard for this kind of type: ${JSON.stringify(type)}`);
}
}
if (typeof data !== "object")
throw new TypeError(`Expected ${prefix} to be an object and not a ${typeof data}!`);
const object = data;
for (const name of Object.keys(type)) {
if (typeof name !== "string")
continue;
assertType(object[name], type[name], `${prefix}.${name}`);
}
}
function assertTypeTuple(data, prefix, [, ...types]) {
assertArray(data);
if (types.length !== data.length) {
throw new TypeError(`Expected ${prefix} to have ${types.length} elements, not ${data.length}!`);
}
for (const [index, type_] of types.entries()) {
const type = type_;
assertType(data[index], type, `${prefix}[$i]`);
}
}
function assertTypePartial(data, prefix, [, type]) {
assertObject(data, prefix);
for (const name of Object.keys(type)) {
if (typeof name !== "string")
continue;
const attrib = data[name];
if (attrib !== undefined) {
assertType(attrib, type[name], `${prefix}.${name}`);
}
}
}
function assertTypeArray(data, prefix, type) {
if (!Array.isArray(data))
throw new TypeError(`Expected ${prefix} to be an array and not a ${typeof data}!`);
const [, subType] = type;
for (const [index, datum] of data.entries()) {
assertType(datum, subType, `${prefix}[${index}]`);
}
}
function assertTypeArrayWithDimension(data, prefix, type, size) {
if (!Array.isArray(data))
throw new TypeError(`Expected ${prefix} to be an array and not a ${typeof data}!`);
if (data.length !== size)
throw new TypeError(`${prefix} was expected to have a length of ${size}, but we got ${data.length}!`);
const [, subType] = type;
for (const [index, datum] of data.entries()) {
assertType(datum, subType, `${prefix}[${index}]`);
}
}
function assertTypeMap(data, prefix, type) {
if (!isObject(data))
throw new TypeError(`Expected ${prefix} to be an object and not a ${typeof data}!`);
const [, subType] = type;
for (const key of Object.keys(data)) {
if (typeof key === "string") {
assertType(data[key], subType, `${prefix}[${key}]`);
}
}
}
function assertTypeOptional(data, prefix, type) {
if (data === undefined)
return;
const [, optionalType] = type;
assertType(data, optionalType, prefix);
}
function assertTypeAlternative(data, prefix, type) {
const [, ...altTypes] = type;
let lastException = new Error(`No type has been defined for this alternative: ${JSON.stringify(type)}!`);
for (const altType of altTypes) {
try {
assertType(data, altType, prefix);
return;
}
catch (error) {
if (error instanceof Error)
lastException = error;
}
}
throw lastException;
}
function assertTypeLiteral(data, prefix, type) {
const [, ...literals] = type;
for (const literal of literals) {
if (data === literal)
return;
}
throw new TypeError(`Expected ${prefix} to be a literal (${literals
.map(item => `"${item}"`)
.join(" | ")})!`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhcmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2d1YXJkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWE7SUFDbEMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDckMsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUE7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBYTtJQUNsQyxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFhO0lBQ2xDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFBO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWE7SUFDbkMsT0FBTyxPQUFPLElBQUksS0FBSyxTQUFTLENBQUE7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYTtJQUN2QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3ZCLE9BQU8sSUFBSSxZQUFZLFdBQVcsQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsSUFBYSxF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