@rr0/data
Version:
RR0 data model
59 lines (58 loc) • 2.01 kB
JavaScript
import { globSync } from "glob";
import { FileContents } from "@javarome/fileutil";
/**
* Fetch RR0 data from JSON files.
*/
export class AllDataService {
/**
*
* @param factories The factories to instantiate different RR0Data types.
*/
constructor(factories) {
this.factories = factories;
this.pathToData = new Map();
}
async getFromDir(dirName, types, fileNames = this.factories.reduce((allFileNames, factory) => Array.from(new Set(allFileNames.concat(factory.fileNames))), [])) {
const key = dirName + "$" + fileNames.join("$");
let dataList = this.pathToData.get(key);
if (dataList === undefined) {
dataList = await this.readAll(dirName, fileNames);
this.pathToData.set(key, dataList);
}
return dataList.filter(data => types.includes(data.type));
}
async read(fileName) {
const dataFile = FileContents.read(fileName, "utf-8");
let data;
for (let i = 0; !data && i < this.factories.length; i++) {
const factory = this.factories[i];
try {
data = factory.createFromFile(dataFile);
}
catch (e) {
console.warn("Could not create a", factory.type, "from", dataFile, "because of", e);
}
}
return data;
}
async readAll(dirName, fileNames) {
const dataList = [];
const p = `${dirName}/*(${fileNames.join("|")})`;
const files = globSync(p);
for (const file of files) {
try {
const dataFile = await this.read(file);
if (dataFile) {
dataList.push(dataFile);
}
else {
throw new Error("No factory to handle " + dataFile.name);
}
}
catch (e) {
console.warn(`Could not create data from ${file}`, e);
}
}
return dataList;
}
}