UNPKG

dbmaster-cli

Version:

Tool for converting tables between Fifa Soccer Games

85 lines (84 loc) 3.84 kB
"use strict"; 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;