Files
bitburner-src/src/utils/GenericReviver.ts
T

46 lines
1.7 KiB
TypeScript

import { constructorsForReviver, isReviverValue } from "./JSONReviver";
import { validateObject } from "./Validator";
export class JSONReviverError extends Error {
ctor: string;
constructor(message: string, ctor: string) {
super(message);
this.name = this.constructor.name;
this.ctor = ctor;
}
}
/**
* A generic "smart reviver" function.
* Looks for object values with a `ctor` property and a `data` property.
* If it finds them, and finds a matching constructor, it hands
* off to that `fromJSON` function, passing in the value. */
export function Reviver(_key: string, value: unknown): any {
if (!isReviverValue(value)) {
return value;
}
const ctor = constructorsForReviver[value.ctor];
if (!ctor) {
// Known missing constructors with special handling.
switch (value.ctor) {
case "AllServersMap": // Reviver removed in v0.43.1
case "Message": // Reviver removed in v1.6.4
case "Industry": // No longer part of save data since v2.3.0
case "Employee": // Entire object removed from game in v2.2.0 (employees abstracted)
case "Company": // Reviver removed in v2.6.1
case "Faction": // Reviver removed in v2.6.1
case "ActionIdentifier": // No longer a class as of v2.6.1
console.warn(`Legacy load type ${value.ctor} converted to expected format while loading.`);
return value.data;
}
// Missing constructor with no special handling. Throw error.
throw new JSONReviverError(`Could not locate constructor named ${value.ctor}.`, value.ctor);
}
const obj = ctor.fromJSON(value);
if (ctor.validationData !== undefined) {
validateObject(obj, ctor.validationData);
}
return obj;
}