Skip to content

Instantly share code, notes, and snippets.

@Jimbly
Created January 30, 2023 20:30
Show Gist options
  • Save Jimbly/03a2c7192ce92e55568954ceded8e916 to your computer and use it in GitHub Desktop.
Save Jimbly/03a2c7192ce92e55568954ceded8e916 to your computer and use it in GitHub Desktop.
Generic common loader for wall types example
import * as assert from 'assert';
import { FSAPI, fileBaseName } from 'glov/common/fsapi';
import { DataObject } from 'glov/common/types';
type WallDesc = {
id: string; // filled in at load
other_id?: string; // from data
other_desc?: WallDesc; // reference at load-time
};
let wall_descs: Partial<Record<string, WallDesc>>;
let fs: FSAPI;
function walltypeLoad(filename: string): WallDesc {
let wall_desc = fs.getFile<WallDesc>(filename, 'jsobj');
let id = fileBaseName(filename);
wall_desc.id = id;
// Do data validation and fixups here
return wall_desc;
}
function walltypeFinalizeReferences(): void {
// fix up any internal references between WallDescs
for (let key in wall_descs) {
let wall_desc = wall_descs[key]!;
if (wall_desc.other_id) {
wall_desc.other_desc = wall_descs[wall_desc.other_id];
}
}
}
function reloadInPlace(new_desc: WallDesc): void {
let { id } = new_desc;
let old_desc = wall_descs[id];
if (!old_desc) {
wall_descs[id] = new_desc;
} else {
for (let key in old_desc) {
delete (old_desc as DataObject)[key];
}
for (let key in new_desc) {
(old_desc as DataObject)[key] = (new_desc as DataObject)[key];
}
new_desc = old_desc;
}
}
const IS_CLIENT = typeof window !== 'undefined';
function reloadWalltype(path: string): void {
if (IS_CLIENT && path.endsWith('.json')) {
return;
}
let new_desc = walltypeLoad(path);
reloadInPlace('wall', new_desc);
walltypeFinalizeReferences();
}
export function crawlerLoadData(fs_in: FSAPI): void {
if (wall_descs) {
return;
}
fs = fs_in;
wall_descs = {};
let files = fs.getFileNames('walltypes/');
for (let ii = 0; ii < files.length; ++ii) {
let filename = files[ii];
let obj = walltypeLoad(filename);
wall_descs[obj.id] = obj;
}
walltypeFinalizeReferences();
fs.filewatchOn(/^walltypes\//, reloadWalltype);
}
export function crawlerGetWallDesc(id: string): WallDesc {
let wall_desc = wall_descs[id];
assert(wall_desc, id);
return wall_desc;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment