#!/usr/bin/env node 'use strict'; const createToC = require('../lib').createToC; const readErrorClassSpec = require('../lib').readErrorClassSpec; const two = require('../lib').two; const filepaths = process.argv.slice(2); /** * Create a table view of an {@link ErrorClassSpec} * @param {ErrorClassSpec} errorClassSpec * @returns {string} markdown */ function createDictionary(errorClassSpec) { return `# ${errorClassSpec.code}XXX: ${errorClassSpec.class} Errors The following document defines all ${errorClassSpec.class} errors. [See here](table.md) for a table view. ` + createToC(errorClassSpec.code, errorClassSpec.subclasses) + '\n\n' + createSections(errorClassSpec.code, errorClassSpec.subclasses); } /** * Create a table header for an {@link ErrorSubclassSpec}. * @param {number} code - a two-digit prefix * @param {ErrorSubclassSpec} errorSubclassSpec * @returns {string} markdown */ function createSectionHeader(code, errorSubclassSpec) { return `## ${code}${errorSubclassSpec.code}XX: ${errorSubclassSpec.class} Errors\n`; } /** * Create a table row for an {@link ErrorSpec}. * @param {number} code - a three-digit prefix * @param {ErrorSpec} errorSpec * @returns {string} markdown */ function createEntry(code, errorSpec) { var markdown = `### ${code}${two(errorSpec.code)}: ${errorSpec.description} ${errorSpec.explanation} `; if (errorSpec.causes.length) { markdown += ` #### Causes ` + errorSpec.causes.map(cause => ` * ${cause}`).join('\n') + '\n'; } if (errorSpec.solutions.length) { markdown += ` #### Solutions ` + errorSpec.solutions.map(solution => ` * ${solution}`).join('\n') + '\n'; } return markdown; } /** * Create table rows for {@link ErrorSpec}s. * @param {number} code - a three-digit prefix * @param {Array} errorSpecs * @returns {string} markdown */ function createEntries(code, errorSpecs) { return errorSpecs.map(errorSpec => createEntry(code, errorSpec)).join('\n'); } /** * Create table rows for {@link ErrorSubclassSpec}s. * @param {number} code - a two-digit prefix * @param {Array} errorSubclassSpecs * @returns {string} markdown */ function createSections(code, errorSubclassSpecs) { return errorSubclassSpecs.map(errorSubclassSpec => { return createSectionHeader(code, errorSubclassSpec) + '\n' + createEntries(code * 10 + errorSubclassSpec.code, errorSubclassSpec.errors); }).join('\n'); } filepaths.forEach(filepath => { const errorClassSpec = readErrorClassSpec(filepath); const markdown = createDictionary(errorClassSpec); console.log(markdown); });