parjs
Version:
A parser-combinator library for JavaScript.
44 lines (38 loc) • 1.27 kB
text/typescript
/**
* @module parjs/combinators
*/
/** */
import {FailureInfo, ResultKind} from "../result";
import {ParsingState} from "../state";
import {ParjsCombinator} from "../../index";
import {defineCombinator} from "./combinator";
import {ParjserBase} from "../parser";
import defaults from "lodash/defaults";
const defaultFailure: FailureInfo = {
reason: "succeeded without capturing input",
kind: "Hard"
};
/**
* Applies the source parser and makes sure it captured some input.
* @param pFailure The failure info.
*/
export function mustCapture<T>(pFailure?: Partial<FailureInfo>): ParjsCombinator<T, T> {
let failure = defaults(pFailure, defaultFailure);
return defineCombinator(source => {
return new class MustCapture extends ParjserBase {
expecting = `expecting internal parser ${source.type} to consume input`;
type = "mustCapture";
_apply(ps: ParsingState) {
let {position} = ps;
source.apply(ps);
if (!ps.isOk) {
return;
}
if (position === ps.position) {
ps.kind = failure.kind;
ps.reason = failure.reason;
}
}
}();
});
}