parser-ts
Version:
String parser combinators for TypeScript
43 lines (42 loc) • 1.07 kB
JavaScript
/**
* @since 0.6.0
*/
import { codeFrameColumns } from '@babel/code-frame';
import { bimap } from 'fp-ts/es6/Either';
import { pipe } from 'fp-ts/es6/function';
import { stream } from './Stream';
var lineTerminatorRegex = /^\r\n$|^[\n\r]$/;
var getLocation = function (source, cursor) {
var line = 1;
var column = 1;
var i = 0;
while (i < cursor) {
i++;
var c = source.charAt(i);
if (lineTerminatorRegex.test(c)) {
line++;
column = 1;
}
else {
column++;
}
}
return {
start: {
line: line,
column: column
}
};
};
/**
* Returns a pretty printed error message using `@babel/code-frame`
*
* @since 0.6.0
*/
export var run = function (p, source) {
return pipe(p(stream(source.split(''))), bimap(function (err) {
return codeFrameColumns(source, getLocation(source, err.input.cursor), {
message: 'Expected: ' + err.expected.join(', ')
});
}, function (succ) { return succ.value; }));
};