const fs = require('fs'); const csvParse = require('csv-parse/lib/sync'); const Usability = { UNKNOWN: 0, USER: 1, BOT: 2, BOTH: 4, }; class MethodInfo { constructor(name, usability, errors, friendly) { this.name = name; this.errors = errors; this.friendly = friendly; if (usability.toUpperCase() in Usability) { this.usability = Usability[usability.toUpperCase()]; } else { throw new Error( `Usability must be either user, bot, both or unknown, not ${usability}` ); } } } /** * Parses the input CSV file with columns (method, usability, errors) * and yields `MethodInfo` instances as a result. */ const parseMethods = function*(csvFile, friendlyCsvFile, errorsDict) { const rawToFriendly = {}; const f1 = csvParse( fs.readFileSync(friendlyCsvFile, { encoding: 'utf-8' }) ); for (const [ns, friendly, rawList] of f1.slice(1)) { for (const raw of rawList.split(' ')) { rawToFriendly[raw] = [ns, friendly]; } } const f2 = csvParse(fs.readFileSync(csvFile, { encoding: 'utf-8' })).slice( 1 ); for (let line = 0; line < f2.length; line++) { let [method, usability, errors] = f2[line]; errors = errors .split(' ') .filter(Boolean) .map(x => { if (x && !(x in errorsDict)) { throw new Error( `Method ${method} references unknown errors ${errors}` ); } return errorsDict[x]; }); const friendly = rawToFriendly[method]; delete rawToFriendly[method]; yield new MethodInfo(method, usability, errors, friendly); } }; module.exports = { Usability, MethodInfo, parseMethods, };