1
0
mirror of https://github.com/JuanCanham/HackMyResume.git synced 2025-05-03 21:07:07 +01:00

Move error handling out of core.

This commit is contained in:
hacksalot
2016-01-13 15:28:02 -05:00
parent eddda8146e
commit 19b30d55ec
7 changed files with 37 additions and 49 deletions

View File

@ -1,190 +0,0 @@
/**
Error-handling routines for HackMyResume.
@module error-handler.js
@license MIT. See LICENSE.md for details.
*/
// TODO: Logging library
(function() {
var HACKMYSTATUS = require('./status-codes')
, PKG = require('../../package.json')
, FS = require('fs')
, FCMD = require('../hackmyapi')
, PATH = require('path')
, WRAP = require('word-wrap')
, chalk = require('chalk')
, SyntaxErrorEx = require('../utils/syntax-error-ex');
/**
An amorphous blob of error handling code for HackMyResume.
@class ErrorHandler
*/
var ErrorHandler = module.exports = {
init: function( debug ) {
this.debug = debug;
},
err: function( ex, shouldExit ) {
var msg = '', exitCode, log = console.log, showStack = ex.showStack;
// If the exception has been handled elsewhere and shouldExit is true,
// let's get out of here, otherwise silently return.
if( ex.handled ) {
if( shouldExit )
process.exit( exitCode );
return;
}
// Get an error message -- either a HackMyResume error message or the
// exception's associated error message
if( ex.fluenterror ){
var errInfo = get_error_msg( ex );
msg = errInfo.msg;
exitCode = ex.fluenterror;
showStack = errInfo.showStack;
}
else {
msg = ex.toString();
exitCode = -1;
// Deal with pesky 'Error:' prefix.
var idx = msg.indexOf('Error: ');
msg = idx === -1 ? msg : msg.substring( idx + 7 );
}
// Log non-HackMyResume-handled errors in red with ERROR prefix. Log HMR
// errors as-is.
ex.fluenterror ?
log( msg.toString() ) :
log( chalk.red.bold('ERROR: ' + msg.toString()) );
// Selectively show the stack trace
if( (ex.stack || (ex.inner && ex.inner.stack)) &&
((showStack && ex.code !== 'ENOENT' ) || (this.debug) ))
log( chalk.red( ex.stack || ex.inner.stack ) );
// Let the error code be the process's return code.
( shouldExit || ex.shouldExit ) && process.exit( exitCode );
}
};
function get_error_msg( ex ) {
var msg = '', withStack = false, isError = false;
switch( ex.fluenterror ) {
case HACKMYSTATUS.themeNotFound:
msg = formatWarning(
chalk.bold("Couldn't find the '" + ex.data + "' theme."),
" Please specify the name of a preinstalled FRESH theme " +
"or the path to a locally installed FRESH or JSON Resume theme.");
break;
case HACKMYSTATUS.copyCSS:
msg = formatWarning("Couldn't copy CSS file to destination folder.");
break;
case HACKMYSTATUS.resumeNotFound:
msg = formatWarning('Please ' + chalk.bold('feed me a resume') +
' in FRESH or JSON Resume format.');
break;
case HACKMYSTATUS.missingCommand:
msg = formatWarning("Please " +chalk.bold("give me a command") + " (");
msg += Object.keys( FCMD.verbs ).map( function(v, idx, ar) {
return (idx === ar.length - 1 ? chalk.yellow('or ') : '') +
chalk.yellow.bold(v.toUpperCase());
}).join( chalk.yellow(', ')) + chalk.yellow(").\n\n");
msg += chalk.gray(FS.readFileSync(
PATH.resolve(__dirname, '../cli/use.txt'), 'utf8' ));
break;
case HACKMYSTATUS.invalidCommand:
msg = formatWarning('Invalid command: "'+chalk.bold(ex.attempted)+'"');
break;
case HACKMYSTATUS.resumeNotFoundAlt:
msg = formatWarning('Please ' + chalk.bold('feed me a resume') +
' in either FRESH or JSON Resume format.');
break;
case HACKMYSTATUS.inputOutputParity:
msg = formatWarning('Please ' +
chalk.bold('specify an output file name') +
' for every input file you wish to convert.');
break;
case HACKMYSTATUS.createNameMissing:
msg = formatWarning('Please ' +
chalk.bold('specify the filename of the resume') + ' to create.');
break;
case HACKMYSTATUS.pdfGeneration:
msg = formatError(chalk.bold('ERROR: PDF generation failed. ') +
'Make sure wkhtmltopdf is installed and accessible from your path.');
if( ex.inner ) msg += chalk.red('\n' + ex.inner);
withStack = true;
break;
case HACKMYSTATUS.invalid:
msg = formatError('Validation failed and the --assert option was ' +
'specified.');
break;
case HACKMYSTATUS.invalidFormat:
ex.data.forEach(function(d){ msg +=
formatWarning('The ' + chalk.bold(ex.theme.name.toUpperCase()) +
" theme doesn't support the " + chalk.bold(d.format.toUpperCase()) +
" format.\n");
});
break;
case HACKMYSTATUS.notOnPath:
msg = formatError( ex.engine + " wasn't found on your system path or" +
" is inaccessible. PDF not generated." );
break;
case HACKMYSTATUS.readError:
msg = formatError( ex.inner.toString() );
break;
case HACKMYSTATUS.parseError:
if( SyntaxErrorEx.is( ex.inner )) {
var se = new SyntaxErrorEx( ex, ex.raw );
msg = formatError( 'Invalid or corrupt JSON on line ' + se.line +
' column ' + se.col );
}
else {
msg = formatError( ex.inner.toString() );
}
break;
}
return {
msg: msg,
withStack: withStack
};
}
function formatError( msg ) {
return chalk.red.bold( 'ERROR: ' + msg );
}
function formatWarning( brief, msg ) {
return chalk.yellow(brief) + chalk.yellow(msg || '');
}
}());

View File

@ -12,41 +12,27 @@ Event code definitions.
module.exports = {
unknown: 0,
unk: 0,
begin: 1,
end: 2,
beforeRead: 3,
afterRead: 4,
beforeCreate: 5,
bc: 5,
afterCreate: 6,
ac: 6,
beforeTheme: 7,
afterTheme: 8,
beforeMerge: 9,
afterMerge: 10,
beforeGenerate: 11,
afterGenerate: 12,
beforeAnalyze: 13,
afterAnalyze: 14,
beforeConvert: 15,
afterConvert: 16,
verifyOutputs: 17,
beforeParse: 18,
afterParse: 19
error: -1,
success: 0,
begin: 1,
end: 2,
beforeRead: 3,
afterRead: 4,
beforeCreate: 5,
afterCreate: 6,
beforeTheme: 7,
afterTheme: 8,
beforeMerge: 9,
afterMerge: 10,
beforeGenerate: 11,
afterGenerate: 12,
beforeAnalyze: 13,
afterAnalyze: 14,
beforeConvert: 15,
afterConvert: 16,
verifyOutputs: 17,
beforeParse: 18,
afterParse: 19
};

View File

@ -22,7 +22,9 @@ Status codes for HackMyResume.
invalidFormat: 12,
notOnPath: 13,
readError: 14,
parseError: 15
parseError: 15,
fileSaveError: 16,
generateError: 17
};
}());