You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
1.8 KiB
JavaScript

"use strict";
function parseCodepoint(input, nullValue) {
if (input === null) {
return nullValue;
} else if (typeof input === "number") {
return input;
} else if (typeof input === "string") {
return input.codePointAt(0);
} else {
// FIXME: Better validation here
throw new Error(`Invalid codepoint input`);
}
}
module.exports = {
zeroOrMore: (rule) => {
return {
__protocolKitInstruction: true,
type: "zeroOrMore",
rule: rule
};
},
oneOrMore: (rule) => {
return {
__protocolKitInstruction: true,
type: "oneOrMore",
rule: rule
};
},
either: (options) => {
return {
__protocolKitInstruction: true,
type: "either",
options: options
};
},
until: (rule, allowEnd = true) => {
return {
__protocolKitInstruction: true,
type: "until",
rule: rule,
// FIXME: Should allowEnd have a different default?
allowEnd: allowEnd
};
},
optional: (rule) => {
return {
__protocolKitInstruction: true,
type: "optional",
rule: rule
};
},
peek: (rule) => {
return {
__protocolKitInstruction: true,
type: "peek",
rule: rule
};
},
test: (rule) => {
return {
__protocolKitInstruction: true,
type: "test",
rule: rule
};
},
wholeMatch: (rule) => {
return {
__protocolKitInstruction: true,
type: "wholeMatch",
rule: rule
};
},
trackPosition: (rule) => {
return {
__protocolKitInstruction: true,
type: "trackPosition",
rule: rule
};
},
EndOfInput: {
__protocolKitInstruction: true,
type: "endOfInput"
},
characterRange: (start, end) => {
// NOTE: Both inclusive!
let startCodepoint = parseCodepoint(start, 0);
let endCodepoint = parseCodepoint(end, Infinity);
return {
__protocolKitInstruction: true,
type: "characterRange",
start: startCodepoint,
end: endCodepoint
};
}
};