Support of error results

This commit is contained in:
boryslevytskyi
2017-05-16 22:35:19 +03:00
parent b6a2205d98
commit afc59fe7dd
6 changed files with 37 additions and 9 deletions

View File

@@ -4,6 +4,7 @@ export default class AppState {
this.commandResults = []; this.commandResults = [];
this.handlers = []; this.handlers = [];
this.uiTheme = persistData.uiTheme || 'dark'; this.uiTheme = persistData.uiTheme || 'dark';
this.debugMode = false;
} }
addCommandResult(result) { addCommandResult(result) {

View File

@@ -2,8 +2,12 @@ import is from './is';
var handlers = []; var handlers = [];
var config = {
errorHandler: (input, err) => logError(err)
}
var cmd = { var cmd = {
debugMode: true, debugMode: false,
execute: function(rawInput) { execute: function(rawInput) {
var input = rawInput.trim().toLowerCase(); var input = rawInput.trim().toLowerCase();
var handler = findHandler(input); var handler = findHandler(input);
@@ -15,12 +19,12 @@ var cmd = {
try { try {
invokeHandler(input, handler); invokeHandler(input, handler);
} catch (e) { } catch (e) {
displayCommandError(input, "Error: " + e); config.errorHandler(input, e);
} }
} }
} }
else { else {
displayCommandError(input, "Unsupported expression: " + input.trim()); logError(input, new Error("Unsupported expression: " + input.trim()));
} }
}, },
commands: function(catalog) { commands: function(catalog) {
@@ -51,11 +55,14 @@ var cmd = {
}, },
clear: function() { clear: function() {
console.log('clear'); console.log('clear');
},
onError: function(handler) {
config.errorHandler = handler;
} }
}; };
function displayCommandError(input, message) { function logError(err) {
console.error(message) console.error(err)
} }
function invokeHandler (input, handler) { function invokeHandler (input, handler) {

View File

@@ -2,6 +2,7 @@ import HelpResult from './models/HelpResult';
import AboutResult from './models/AboutResult'; import AboutResult from './models/AboutResult';
import UnknownCommandResult from './models/UnknownCommandResult'; import UnknownCommandResult from './models/UnknownCommandResult';
import ExpressionResult from './models/ExpressionResult'; import ExpressionResult from './models/ExpressionResult';
import ErrorResult from './models/ErrorResult';
import * as expression from './expression'; import * as expression from './expression';
var cmdConfig = {}; var cmdConfig = {};
@@ -36,16 +37,15 @@ export default {
'about': function(c) { 'about': function(c) {
appState.addCommandResult(new AboutResult(c.input)); appState.addCommandResult(new AboutResult(c.input));
}, },
'-debug': function() {
app.debugMode = true;
console.log('debug is on');
},
'-notrack': function () {} '-notrack': function () {}
}); });
// Last command handler reports that input is unknown
cmd.command({ cmd.command({
canHandle: () => true, canHandle: () => true,
handle: (c) => appState.addCommandResult(new UnknownCommandResult(c.input)) handle: (c) => appState.addCommandResult(new UnknownCommandResult(c.input))
}); });
cmd.onError((input, err) => appState.addCommandResult(new ErrorResult(input, err)));
} }
} }

View File

@@ -6,6 +6,7 @@ import HelpResultView from './HelpResultView';
import AboutResultView from './AboutResultView'; import AboutResultView from './AboutResultView';
import ExpressionResult from '../../models/ExpressionResult'; import ExpressionResult from '../../models/ExpressionResult';
import ExpressionResultView from './ExpressionResultView'; import ExpressionResultView from './ExpressionResultView';
import ErrorResult from '../../models/ErrorResult';
export default class DisplayResult extends React.Component { export default class DisplayResult extends React.Component {
render() { render() {
@@ -14,6 +15,10 @@ export default class DisplayResult extends React.Component {
return this.renderUnknown(); return this.renderUnknown();
} }
if(this.props.content instanceof ErrorResult) {
return this.renderError(this.props.content.error.message);
}
return <div className="result"> return <div className="result">
<div className="input mono"><span className="cur">&gt;</span>{this.props.content.input}<a className="hashLink" title="Link for this expression" href={window.location.pathname + '#' + this.props.inputHash}>#</a></div> <div className="input mono"><span className="cur">&gt;</span>{this.props.content.input}<a className="hashLink" title="Link for this expression" href={window.location.pathname + '#' + this.props.inputHash}>#</a></div>
<div className="content"> <div className="content">
@@ -28,6 +33,12 @@ export default class DisplayResult extends React.Component {
</div> </div>
} }
renderError(message) {
return <div className="result">
<div className="error">(X_X) Error occurred: <strong>{message}</strong></div>
</div>
}
findResultComponent(result) { findResultComponent(result) {
if(result instanceof HelpResult) { if(result instanceof HelpResult) {
return <HelpResultView content={result} /> return <HelpResultView content={result} />

View File

@@ -0,0 +1,8 @@
import CommandResult from './CommandResult';
export default class ErrorResult extends CommandResult {
constructor(input, error) {
super(input);
this.error = error;
}
}

View File

@@ -83,6 +83,7 @@ code { font-size: 1.2em; font-weight: bold; }
.dark .hashLink, .dark .hashLink:visited { color: #333 } .dark .hashLink, .dark .hashLink:visited { color: #333 }
.dark .hashLink:hover { color: #999 } .dark .hashLink:hover { color: #999 }
.dark ul.top-links li:hover { background: #333 } .dark ul.top-links li:hover { background: #333 }
.dark .error { color: mediumvioletred}
/* Top Links Shrink */ /* Top Links Shrink */
@media (max-width: 800px) { @media (max-width: 800px) {