src/dialog.ts
import {
NOT_FOUND_CODE ,
BAD_REQUEST ,
DEFAULT_MOPT_CONFIG ,
VMI ,
} from "./moptConstants";
import {
IFailingCheck ,
ILoggingMessage ,
IOptions ,
IUseOptions ,
} from "./interfaces";
const dateNTime = require( "date-and-time" );
const hintDefinitions = ( object: IUseOptions , hint: boolean ) => {
if ( hint ) {
const stringify = require( "json-stringify-pretty-compact" );
const colorizeJson = require( "json-colorizer" );
console.log(
`modulopt configuration for the instance of "${object.constructor.name}" (class) :\n` ,
colorizeJson( stringify( object.modulopt ) )
);
}
return object;
};
const getNowString = ( date: Date , format = "hh:mm A [GMT]Z" ) => {
return dateNTime.format( date , format );
};
const checkValidCall = ( check: IFailingCheck ): void => {
const { data , kind } = check;
const config =
data.modulopt.config !== undefined
? data.modulopt.config
: DEFAULT_MOPT_CONFIG;
const moduloptConfig = config.options;
let verb = "UNKNOWN";
switch ( kind ) {
case "options" :
verb = moduloptConfig.mismatch;
break;
case "propositions" :
verb = moduloptConfig.misspelled;
break;
case "free" :
verb = moduloptConfig.mysterious;
break;
default :
throw "MODULOPT EXCEPTION c400. Unknown interraction kind. Specify either options, propositions or free";
}
const message = constructMessage( check , verb );
interactOnVerb( check , verb , message );
};
const interactOnVerb = (
check: IFailingCheck ,
verb: string ,
message: string
) => {
if ( verb === "throw" ) {
throw message;
} else if ( verb !== "ignore" && verb !== "report" ) {
( console as any )[ VMI[ verb ].interaction ]( message );
} else if ( verb === "report" ) {
onShouldReport( check , message );
}
};
const constructMessage = ( check: IFailingCheck , verb: string ): string => {
const { data , key , kind , value } = check;
let messageParts: string[] = [ "MODULOPT UKNOWN" ];
const singularKind = kind.replace( /s$/g , "" );
messageParts.push(
kind == "options"
? `c${NOT_FOUND_CODE}. Non existing ${singularKind} [${key}] on`
: kind == "propositions"
? `c${BAD_REQUEST}. Invalid ${singularKind} [${value}] for [${key}] option on`
: `c${BAD_REQUEST}. Invalid ${singularKind} value [${value}] for the ${singularKind} [${key}] option on`
);
messageParts.push( `[${data.constructor.name}] object` );
if ( verb === "throw" ) {
messageParts[ 0 ] = "MODULOPT EXCEPTION";
} else if ( verb !== "ignore" && verb !== "report" ) {
messageParts[ 0 ] = `MODULOPT ${VMI[ verb ].type}`;
} else if ( verb === "report" ) {
messageParts[ 0 ] = "MODULOPT REPORT MISMATCH";
messageParts = [ `[${getNowString( new Date() )}]` ].concat( messageParts );
}
return messageParts.join( " " );
};
const onShouldReport = ( check: IFailingCheck , message: string ) => {
const time = new Date();
const log: ILoggingMessage = {
timestamp : time.getTime() ,
message : message ,
// so you can get the stacktrace
exception : new Error( message ) ,
// the code is get from the message. It is formated la this (with a dot at the end) : cXXX.
code : parseInt( /c([\d]+)\./.exec( message )![ 1 ] ) ,
// can help figuring the error out
changes : [
"These changes lead to the orror:" ,
check.data.options[ check.key ] ,
">>>>>" ,
check.value ,
] ,
};
check.data.modulopt.logs.push( log );
};
export { hintDefinitions , checkValidCall };