dbmaster-cli
Version:
Tool for converting tables between Fifa Soccer Games
85 lines (84 loc) • 3.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PersonExtractor = void 0;
const actions_1 = require("../actions");
const fifa_config_1 = require("../fifa-config");
const interfaces_1 = require("../interfaces");
class PersonExtractor {
constructor(targetFifa) {
this.config = fifa_config_1.fifaConfigFactory(targetFifa);
}
async getAttributes(inputFolder) {
const players = await this.readTable(inputFolder, interfaces_1.Table.Players);
const referees = await this.readTable(inputFolder, interfaces_1.Table.Referee);
return Object.values(interfaces_1.PersonAttribute).reduce((acc, attr) => ({
...acc,
[attr]: this.getGroupedAttribute(players, referees, attr)
}), {});
}
async getAttribute(inputFolder, attribute) {
const players = await this.readTable(inputFolder, interfaces_1.Table.Players);
const referees = await this.readTable(inputFolder, interfaces_1.Table.Referee);
return this.getGroupedAttribute(players, referees, attribute);
}
getGroupedAttribute(players, referees, attribute) {
switch (attribute) {
case interfaces_1.PersonAttribute.HeadTypeCode:
return this.groupedAttribute(players.filter(this.filterByHeadClassFn(interfaces_1.HeadClassCode.Generic)), referees.filter(this.filterByHeadClassFn(interfaces_1.HeadClassCode.Generic)), attribute);
default:
return this.groupedAttribute(players, referees, attribute);
}
}
groupedAttribute(players, referees, attribute) {
const playersAttribute = this.filterAttribute(players.filter(this.filterByHeadClassFn(interfaces_1.HeadClassCode.Generic)), attribute);
const refereesAttribute = this.filterAttribute(referees.filter(this.filterByHeadClassFn(interfaces_1.HeadClassCode.Generic)), attribute);
return {
man: this.mergeTables(refereesAttribute, playersAttribute, 'man').man,
woman: this.mergeTables(refereesAttribute, playersAttribute, 'woman').woman
};
}
filterAttribute(persons, attribute) {
const woman = persons.filter(this.filterByGenderFn(interfaces_1.Gender.Woman)).reduce(this.reduceFn(attribute), {});
const man = persons.filter(this.filterByGenderFn(interfaces_1.Gender.Man)).reduce(this.reduceFn(attribute), {});
return { man, woman };
}
async readTable(inputFolder, table) {
const list = [];
return new Promise(async (resolve, reject) => new actions_1.StreamBuilder(inputFolder, table, this.config[table])
.actionOnData((data) => list.push(data))
.onFinish(() => resolve(list))
.onError(() => reject(list)));
}
filterByHeadClassFn(headClassCode) {
return (p) => p.headclasscode === headClassCode;
}
filterByGenderFn(gender) {
return (p) => {
if (gender === interfaces_1.Gender.Woman) {
return p.gender === interfaces_1.Gender.Woman;
}
else {
return p.gender === null || p.gender === undefined || p.gender === interfaces_1.Gender.Man;
}
};
}
reduceFn(field) {
return (acc, cur) => {
const value = acc[cur[field]];
return { ...acc, [cur[field]]: value ? value + 1 : 1 };
};
}
mergeTables(source, target, genderKey) {
for (const key of Object.keys(source[genderKey])) {
const value = target[genderKey][key];
if (value) {
target[genderKey][key] += source[genderKey][key];
}
else {
target[genderKey][key] = source[genderKey][key];
}
}
return target;
}
}
exports.PersonExtractor = PersonExtractor;