epic-formulae
Version:
Simple data store to house epic formulae
94 lines (93 loc) • 3.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const sync_1 = require("csv-stringify/sync");
const db_1 = require("../db");
const formula_1 = require("../models/formula");
const document_1 = require("../document");
class List extends core_1.Command {
constructor() {
super(...arguments);
this.document = new document_1.default('Formulae');
}
async findAndGroupByMetre() {
this.document.paragraph('Ordered by metre');
const formulae = await formula_1.Formula.find().sort({ metricalSortKey: 1 });
for (const [idx, element] of formulae.entries()) {
// this.log(`Working on formula: ${element}`)
const lastPrettyMetre = idx > 0 ? formulae[idx - 1].prettyMetreForGrouping : '';
if (element.prettyMetreForGrouping !== lastPrettyMetre) {
this.document.heading(element.prettyMetreForGrouping);
}
this.document.paragraph(`${element.text} _(${element.referent})_`);
}
}
async findAndGroupByReferent() {
this.document.paragraph('Ordered by referent');
const formulae = await formula_1.Formula.find().sort({ referent: 1 });
for (const [idx, element] of formulae.entries()) {
// this.log(`Working on formula: ${element}`)
const lastReferent = idx > 0 ? formulae[idx - 1].referent : '';
if (element.referent !== lastReferent) {
this.document.heading(element.referent);
}
this.document.paragraph(`${element.text} \`${element.metre}\``);
}
}
async generateCsv(group) {
const rows = [['text', 'metre', 'referent']];
const sortBy = group === 'metre' ? 'metricalSortKey' : 'referent';
const formulae = await formula_1.Formula.find().sort({ [sortBy]: 1 });
for (const formula of formulae) {
rows.push([
formula.text,
formula.metre,
formula.referent,
]);
}
return (0, sync_1.stringify)(rows);
}
async generateMarkdown(group) {
await (group === 'metre' ?
this.findAndGroupByMetre() :
this.findAndGroupByReferent());
return this.document.toString();
}
async generate(format, group) {
return (format === 'markdown' ?
this.generateMarkdown(group) :
this.generateCsv(group));
}
writeOutput(body) {
this.log(body);
}
async run() {
const { flags } = await this.parse(List);
const { format, group } = flags;
await (0, db_1.connect)();
const output = await this.generate(format, group);
await (0, db_1.disconnect)();
this.writeOutput(output);
}
}
exports.default = List;
List.description = 'List the formulae from the data store';
List.examples = [
'formula list',
'formula list -g metre',
'formula list -f csv',
];
List.flags = {
format: core_1.Flags.string({
char: 'f',
default: 'markdown',
description: 'Output format',
options: ['csv', 'markdown'],
}),
group: core_1.Flags.string({
char: 'g',
default: 'referent',
description: 'Group results',
options: ['metre', 'referent'],
}),
};