Created
January 30, 2023 20:30
-
-
Save Jimbly/03a2c7192ce92e55568954ceded8e916 to your computer and use it in GitHub Desktop.
Generic common loader for wall types example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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