Last active
March 31, 2024 13:54
-
-
Save stu43005/1dd84a8de1d6c4ae33715591d7d928cd to your computer and use it in GitHub Desktop.
Prometheus data parser
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = // @generated by Peggy 4.0.2. | |
// | |
// https://peggyjs.org/ | |
(function() { | |
"use strict"; | |
function peg$subclass(child, parent) { | |
function C() { this.constructor = child; } | |
C.prototype = parent.prototype; | |
child.prototype = new C(); | |
} | |
function peg$SyntaxError(message, expected, found, location) { | |
var self = Error.call(this, message); | |
// istanbul ignore next Check is a necessary evil to support older environments | |
if (Object.setPrototypeOf) { | |
Object.setPrototypeOf(self, peg$SyntaxError.prototype); | |
} | |
self.expected = expected; | |
self.found = found; | |
self.location = location; | |
self.name = "SyntaxError"; | |
return self; | |
} | |
peg$subclass(peg$SyntaxError, Error); | |
function peg$padEnd(str, targetLength, padString) { | |
padString = padString || " "; | |
if (str.length > targetLength) { return str; } | |
targetLength -= str.length; | |
padString += padString.repeat(targetLength); | |
return str + padString.slice(0, targetLength); | |
} | |
peg$SyntaxError.prototype.format = function(sources) { | |
var str = "Error: " + this.message; | |
if (this.location) { | |
var src = null; | |
var k; | |
for (k = 0; k < sources.length; k++) { | |
if (sources[k].source === this.location.source) { | |
src = sources[k].text.split(/\r\n|\n|\r/g); | |
break; | |
} | |
} | |
var s = this.location.start; | |
var offset_s = (this.location.source && (typeof this.location.source.offset === "function")) | |
? this.location.source.offset(s) | |
: s; | |
var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column; | |
if (src) { | |
var e = this.location.end; | |
var filler = peg$padEnd("", offset_s.line.toString().length, ' '); | |
var line = src[s.line - 1]; | |
var last = s.line === e.line ? e.column : line.length + 1; | |
var hatLen = (last - s.column) || 1; | |
str += "\n --> " + loc + "\n" | |
+ filler + " |\n" | |
+ offset_s.line + " | " + line + "\n" | |
+ filler + " | " + peg$padEnd("", s.column - 1, ' ') | |
+ peg$padEnd("", hatLen, "^"); | |
} else { | |
str += "\n at " + loc; | |
} | |
} | |
return str; | |
}; | |
peg$SyntaxError.buildMessage = function(expected, found) { | |
var DESCRIBE_EXPECTATION_FNS = { | |
literal: function(expectation) { | |
return "\"" + literalEscape(expectation.text) + "\""; | |
}, | |
class: function(expectation) { | |
var escapedParts = expectation.parts.map(function(part) { | |
return Array.isArray(part) | |
? classEscape(part[0]) + "-" + classEscape(part[1]) | |
: classEscape(part); | |
}); | |
return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]"; | |
}, | |
any: function() { | |
return "any character"; | |
}, | |
end: function() { | |
return "end of input"; | |
}, | |
other: function(expectation) { | |
return expectation.description; | |
} | |
}; | |
function hex(ch) { | |
return ch.charCodeAt(0).toString(16).toUpperCase(); | |
} | |
function literalEscape(s) { | |
return s | |
.replace(/\\/g, "\\\\") | |
.replace(/"/g, "\\\"") | |
.replace(/\0/g, "\\0") | |
.replace(/\t/g, "\\t") | |
.replace(/\n/g, "\\n") | |
.replace(/\r/g, "\\r") | |
.replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) | |
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); | |
} | |
function classEscape(s) { | |
return s | |
.replace(/\\/g, "\\\\") | |
.replace(/\]/g, "\\]") | |
.replace(/\^/g, "\\^") | |
.replace(/-/g, "\\-") | |
.replace(/\0/g, "\\0") | |
.replace(/\t/g, "\\t") | |
.replace(/\n/g, "\\n") | |
.replace(/\r/g, "\\r") | |
.replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) | |
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); | |
} | |
function describeExpectation(expectation) { | |
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); | |
} | |
function describeExpected(expected) { | |
var descriptions = expected.map(describeExpectation); | |
var i, j; | |
descriptions.sort(); | |
if (descriptions.length > 0) { | |
for (i = 1, j = 1; i < descriptions.length; i++) { | |
if (descriptions[i - 1] !== descriptions[i]) { | |
descriptions[j] = descriptions[i]; | |
j++; | |
} | |
} | |
descriptions.length = j; | |
} | |
switch (descriptions.length) { | |
case 1: | |
return descriptions[0]; | |
case 2: | |
return descriptions[0] + " or " + descriptions[1]; | |
default: | |
return descriptions.slice(0, -1).join(", ") | |
+ ", or " | |
+ descriptions[descriptions.length - 1]; | |
} | |
} | |
function describeFound(found) { | |
return found ? "\"" + literalEscape(found) + "\"" : "end of input"; | |
} | |
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; | |
}; | |
function peg$parse(input, options) { | |
options = options !== undefined ? options : {}; | |
var peg$FAILED = {}; | |
var peg$source = options.grammarSource; | |
var peg$startRuleFunctions = { Metrics: peg$parseMetrics }; | |
var peg$startRuleFunction = peg$parseMetrics; | |
var peg$c0 = "\n"; | |
var peg$c1 = "\n\n"; | |
var peg$c2 = "# HELP "; | |
var peg$c3 = " "; | |
var peg$c4 = "# TYPE "; | |
var peg$c5 = "{"; | |
var peg$c6 = ","; | |
var peg$c7 = "}"; | |
var peg$c8 = "=\""; | |
var peg$c9 = "\\"; | |
var peg$c10 = "\""; | |
var peg$c11 = "Nan"; | |
var peg$c12 = "-Inf"; | |
var peg$c13 = "+Inf"; | |
var peg$r0 = /^[^\n]/; | |
var peg$r1 = /^[a-z]/i; | |
var peg$r2 = /^[^\\"]/; | |
var peg$r3 = /^[a-zA-Z_:]/; | |
var peg$r4 = /^[a-zA-Z0-9_:]/; | |
var peg$r5 = /^[a-zA-Z_]/; | |
var peg$r6 = /^[a-zA-Z0-9_]/; | |
var peg$r7 = /^[0-9.]/; | |
var peg$e0 = peg$literalExpectation("\n", false); | |
var peg$e1 = peg$literalExpectation("\n\n", false); | |
var peg$e2 = peg$literalExpectation("# HELP ", false); | |
var peg$e3 = peg$literalExpectation(" ", false); | |
var peg$e4 = peg$classExpectation(["\n"], true, false); | |
var peg$e5 = peg$literalExpectation("# TYPE ", false); | |
var peg$e6 = peg$classExpectation([["a", "z"]], false, true); | |
var peg$e7 = peg$literalExpectation("{", false); | |
var peg$e8 = peg$literalExpectation(",", false); | |
var peg$e9 = peg$literalExpectation("}", false); | |
var peg$e10 = peg$literalExpectation("=\"", false); | |
var peg$e11 = peg$literalExpectation("\\", false); | |
var peg$e12 = peg$anyExpectation(); | |
var peg$e13 = peg$classExpectation(["\\", "\""], true, false); | |
var peg$e14 = peg$literalExpectation("\"", false); | |
var peg$e15 = peg$otherExpectation("metric name"); | |
var peg$e16 = peg$classExpectation([["a", "z"], ["A", "Z"], "_", ":"], false, false); | |
var peg$e17 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", ":"], false, false); | |
var peg$e18 = peg$otherExpectation("label name"); | |
var peg$e19 = peg$classExpectation([["a", "z"], ["A", "Z"], "_"], false, false); | |
var peg$e20 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_"], false, false); | |
var peg$e21 = peg$otherExpectation("number"); | |
var peg$e22 = peg$classExpectation([["0", "9"], "."], false, false); | |
var peg$e23 = peg$literalExpectation("Nan", false); | |
var peg$e24 = peg$literalExpectation("-Inf", false); | |
var peg$e25 = peg$literalExpectation("+Inf", false); | |
var peg$f0 = function(help, type, values) { return { help, type, values }; }; | |
var peg$f1 = function(name, help) { return { name, help }; }; | |
var peg$f2 = function(name, type) { return { name, type }; }; | |
var peg$f3 = function(name, labels, value) { return { name, labels, value }; }; | |
var peg$f4 = function() { return []; }; | |
var peg$f5 = function(name, value) { return { name, value }; }; | |
var peg$f6 = function(digits) { return parseFloat(digits); }; | |
var peg$f7 = function() { return NaN; }; | |
var peg$f8 = function() { return -Infinity; }; | |
var peg$f9 = function() { return +Infinity; }; | |
var peg$currPos = options.peg$currPos | 0; | |
var peg$savedPos = peg$currPos; | |
var peg$posDetailsCache = [{ line: 1, column: 1 }]; | |
var peg$maxFailPos = peg$currPos; | |
var peg$maxFailExpected = options.peg$maxFailExpected || []; | |
var peg$silentFails = options.peg$silentFails | 0; | |
var peg$result; | |
if (options.startRule) { | |
if (!(options.startRule in peg$startRuleFunctions)) { | |
throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); | |
} | |
peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; | |
} | |
function text() { | |
return input.substring(peg$savedPos, peg$currPos); | |
} | |
function offset() { | |
return peg$savedPos; | |
} | |
function range() { | |
return { | |
source: peg$source, | |
start: peg$savedPos, | |
end: peg$currPos | |
}; | |
} | |
function location() { | |
return peg$computeLocation(peg$savedPos, peg$currPos); | |
} | |
function expected(description, location) { | |
location = location !== undefined | |
? location | |
: peg$computeLocation(peg$savedPos, peg$currPos); | |
throw peg$buildStructuredError( | |
[peg$otherExpectation(description)], | |
input.substring(peg$savedPos, peg$currPos), | |
location | |
); | |
} | |
function error(message, location) { | |
location = location !== undefined | |
? location | |
: peg$computeLocation(peg$savedPos, peg$currPos); | |
throw peg$buildSimpleError(message, location); | |
} | |
function peg$literalExpectation(text, ignoreCase) { | |
return { type: "literal", text: text, ignoreCase: ignoreCase }; | |
} | |
function peg$classExpectation(parts, inverted, ignoreCase) { | |
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; | |
} | |
function peg$anyExpectation() { | |
return { type: "any" }; | |
} | |
function peg$endExpectation() { | |
return { type: "end" }; | |
} | |
function peg$otherExpectation(description) { | |
return { type: "other", description: description }; | |
} | |
function peg$computePosDetails(pos) { | |
var details = peg$posDetailsCache[pos]; | |
var p; | |
if (details) { | |
return details; | |
} else { | |
if (pos >= peg$posDetailsCache.length) { | |
p = peg$posDetailsCache.length - 1; | |
} else { | |
p = pos; | |
while (!peg$posDetailsCache[--p]) {} | |
} | |
details = peg$posDetailsCache[p]; | |
details = { | |
line: details.line, | |
column: details.column | |
}; | |
while (p < pos) { | |
if (input.charCodeAt(p) === 10) { | |
details.line++; | |
details.column = 1; | |
} else { | |
details.column++; | |
} | |
p++; | |
} | |
peg$posDetailsCache[pos] = details; | |
return details; | |
} | |
} | |
function peg$computeLocation(startPos, endPos, offset) { | |
var startPosDetails = peg$computePosDetails(startPos); | |
var endPosDetails = peg$computePosDetails(endPos); | |
var res = { | |
source: peg$source, | |
start: { | |
offset: startPos, | |
line: startPosDetails.line, | |
column: startPosDetails.column | |
}, | |
end: { | |
offset: endPos, | |
line: endPosDetails.line, | |
column: endPosDetails.column | |
} | |
}; | |
if (offset && peg$source && (typeof peg$source.offset === "function")) { | |
res.start = peg$source.offset(res.start); | |
res.end = peg$source.offset(res.end); | |
} | |
return res; | |
} | |
function peg$fail(expected) { | |
if (peg$currPos < peg$maxFailPos) { return; } | |
if (peg$currPos > peg$maxFailPos) { | |
peg$maxFailPos = peg$currPos; | |
peg$maxFailExpected = []; | |
} | |
peg$maxFailExpected.push(expected); | |
} | |
function peg$buildSimpleError(message, location) { | |
return new peg$SyntaxError(message, null, null, location); | |
} | |
function peg$buildStructuredError(expected, found, location) { | |
return new peg$SyntaxError( | |
peg$SyntaxError.buildMessage(expected, found), | |
expected, | |
found, | |
location | |
); | |
} | |
function peg$parseMetrics() { | |
var s0, s1, s2, s3, s4; | |
s0 = peg$currPos; | |
s1 = []; | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s2 = peg$c0; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
while (s2 !== peg$FAILED) { | |
s1.push(s2); | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s2 = peg$c0; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
} | |
s2 = []; | |
s3 = peg$parseMetric(); | |
while (s3 !== peg$FAILED) { | |
s2.push(s3); | |
s3 = peg$currPos; | |
if (input.substr(peg$currPos, 2) === peg$c1) { | |
s4 = peg$c1; | |
peg$currPos += 2; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e1); } | |
} | |
if (s4 !== peg$FAILED) { | |
s4 = peg$parseMetric(); | |
if (s4 === peg$FAILED) { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} else { | |
s3 = s4; | |
} | |
} else { | |
s3 = s4; | |
} | |
} | |
s3 = []; | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s4 = peg$c0; | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
while (s4 !== peg$FAILED) { | |
s3.push(s4); | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s4 = peg$c0; | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
} | |
s0 = s2; | |
return s0; | |
} | |
function peg$parseMetric() { | |
var s0, s1, s2, s3, s4, s5, s6, s7; | |
s0 = peg$currPos; | |
s1 = peg$parseHelp(); | |
if (s1 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s2 = peg$c0; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$parseType(); | |
if (s3 !== peg$FAILED) { | |
s4 = []; | |
s5 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s6 = peg$c0; | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
if (s6 !== peg$FAILED) { | |
s7 = peg$parseValue(); | |
if (s7 !== peg$FAILED) { | |
s5 = s7; | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
while (s5 !== peg$FAILED) { | |
s4.push(s5); | |
s5 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 10) { | |
s6 = peg$c0; | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
if (s6 !== peg$FAILED) { | |
s7 = peg$parseValue(); | |
if (s7 !== peg$FAILED) { | |
s5 = s7; | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
} | |
peg$savedPos = s0; | |
s0 = peg$f0(s1, s3, s4); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseHelp() { | |
var s0, s1, s2, s3, s4, s5, s6; | |
s0 = peg$currPos; | |
if (input.substr(peg$currPos, 7) === peg$c2) { | |
s1 = peg$c2; | |
peg$currPos += 7; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e2); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = peg$parsename(); | |
if (s2 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 32) { | |
s3 = peg$c3; | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e3); } | |
} | |
if (s3 !== peg$FAILED) { | |
s4 = peg$currPos; | |
s5 = []; | |
s6 = input.charAt(peg$currPos); | |
if (peg$r0.test(s6)) { | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e4); } | |
} | |
while (s6 !== peg$FAILED) { | |
s5.push(s6); | |
s6 = input.charAt(peg$currPos); | |
if (peg$r0.test(s6)) { | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e4); } | |
} | |
} | |
s4 = input.substring(s4, peg$currPos); | |
peg$savedPos = s0; | |
s0 = peg$f1(s2, s4); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseType() { | |
var s0, s1, s2, s3, s4, s5, s6; | |
s0 = peg$currPos; | |
if (input.substr(peg$currPos, 7) === peg$c4) { | |
s1 = peg$c4; | |
peg$currPos += 7; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e5); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = peg$parsename(); | |
if (s2 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 32) { | |
s3 = peg$c3; | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e3); } | |
} | |
if (s3 !== peg$FAILED) { | |
s4 = peg$currPos; | |
s5 = []; | |
s6 = input.charAt(peg$currPos); | |
if (peg$r1.test(s6)) { | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e6); } | |
} | |
if (s6 !== peg$FAILED) { | |
while (s6 !== peg$FAILED) { | |
s5.push(s6); | |
s6 = input.charAt(peg$currPos); | |
if (peg$r1.test(s6)) { | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e6); } | |
} | |
} | |
} else { | |
s5 = peg$FAILED; | |
} | |
if (s5 !== peg$FAILED) { | |
s4 = input.substring(s4, peg$currPos); | |
} else { | |
s4 = s5; | |
} | |
if (s4 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f2(s2, s4); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseValue() { | |
var s0, s1, s2, s3, s4; | |
s0 = peg$currPos; | |
s1 = peg$parsename(); | |
if (s1 !== peg$FAILED) { | |
s2 = peg$parseLabels(); | |
if (s2 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 32) { | |
s3 = peg$c3; | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e3); } | |
} | |
if (s3 !== peg$FAILED) { | |
s4 = peg$parseinteger(); | |
if (s4 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f3(s1, s2, s4); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseLabels() { | |
var s0, s1, s2, s3, s4, s5; | |
s0 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 123) { | |
s1 = peg$c5; | |
peg$currPos++; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e7); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = peg$currPos; | |
s3 = []; | |
s4 = peg$parseLabel(); | |
while (s4 !== peg$FAILED) { | |
s3.push(s4); | |
s4 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 44) { | |
s5 = peg$c6; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e8); } | |
} | |
if (s5 !== peg$FAILED) { | |
s5 = peg$parseLabel(); | |
if (s5 === peg$FAILED) { | |
peg$currPos = s4; | |
s4 = peg$FAILED; | |
} else { | |
s4 = s5; | |
} | |
} else { | |
s4 = s5; | |
} | |
} | |
if (s3.length < 1) { | |
peg$currPos = s2; | |
s2 = peg$FAILED; | |
} else { | |
s2 = s3; | |
} | |
if (s2 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 125) { | |
s3 = peg$c7; | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e9); } | |
} | |
if (s3 !== peg$FAILED) { | |
s0 = s2; | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
if (s0 === peg$FAILED) { | |
s0 = peg$currPos; | |
s1 = ''; | |
peg$savedPos = s0; | |
s1 = peg$f4(); | |
s0 = s1; | |
} | |
return s0; | |
} | |
function peg$parseLabel() { | |
var s0, s1, s2, s3, s4, s5, s6, s7; | |
s0 = peg$currPos; | |
s1 = peg$parselabelName(); | |
if (s1 !== peg$FAILED) { | |
if (input.substr(peg$currPos, 2) === peg$c8) { | |
s2 = peg$c8; | |
peg$currPos += 2; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e10); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$currPos; | |
s4 = []; | |
s5 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 92) { | |
s6 = peg$c9; | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
if (s6 !== peg$FAILED) { | |
if (input.length > peg$currPos) { | |
s7 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s7 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
if (s7 !== peg$FAILED) { | |
s6 = [s6, s7]; | |
s5 = s6; | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
if (s5 === peg$FAILED) { | |
s5 = input.charAt(peg$currPos); | |
if (peg$r2.test(s5)) { | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e13); } | |
} | |
} | |
while (s5 !== peg$FAILED) { | |
s4.push(s5); | |
s5 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 92) { | |
s6 = peg$c9; | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
if (s6 !== peg$FAILED) { | |
if (input.length > peg$currPos) { | |
s7 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s7 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
if (s7 !== peg$FAILED) { | |
s6 = [s6, s7]; | |
s5 = s6; | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s5; | |
s5 = peg$FAILED; | |
} | |
if (s5 === peg$FAILED) { | |
s5 = input.charAt(peg$currPos); | |
if (peg$r2.test(s5)) { | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e13); } | |
} | |
} | |
} | |
s3 = input.substring(s3, peg$currPos); | |
if (input.charCodeAt(peg$currPos) === 34) { | |
s4 = peg$c10; | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e14); } | |
} | |
if (s4 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f5(s1, s3); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parsename() { | |
var s0, s1, s2, s3, s4; | |
peg$silentFails++; | |
s0 = peg$currPos; | |
s1 = peg$currPos; | |
s2 = input.charAt(peg$currPos); | |
if (peg$r3.test(s2)) { | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e16); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = []; | |
s4 = input.charAt(peg$currPos); | |
if (peg$r4.test(s4)) { | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e17); } | |
} | |
while (s4 !== peg$FAILED) { | |
s3.push(s4); | |
s4 = input.charAt(peg$currPos); | |
if (peg$r4.test(s4)) { | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e17); } | |
} | |
} | |
s2 = [s2, s3]; | |
s1 = s2; | |
} else { | |
peg$currPos = s1; | |
s1 = peg$FAILED; | |
} | |
if (s1 !== peg$FAILED) { | |
s0 = input.substring(s0, peg$currPos); | |
} else { | |
s0 = s1; | |
} | |
peg$silentFails--; | |
if (s0 === peg$FAILED) { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e15); } | |
} | |
return s0; | |
} | |
function peg$parselabelName() { | |
var s0, s1, s2, s3, s4; | |
peg$silentFails++; | |
s0 = peg$currPos; | |
s1 = peg$currPos; | |
s2 = input.charAt(peg$currPos); | |
if (peg$r5.test(s2)) { | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e19); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = []; | |
s4 = input.charAt(peg$currPos); | |
if (peg$r6.test(s4)) { | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e20); } | |
} | |
while (s4 !== peg$FAILED) { | |
s3.push(s4); | |
s4 = input.charAt(peg$currPos); | |
if (peg$r6.test(s4)) { | |
peg$currPos++; | |
} else { | |
s4 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e20); } | |
} | |
} | |
s2 = [s2, s3]; | |
s1 = s2; | |
} else { | |
peg$currPos = s1; | |
s1 = peg$FAILED; | |
} | |
if (s1 !== peg$FAILED) { | |
s0 = input.substring(s0, peg$currPos); | |
} else { | |
s0 = s1; | |
} | |
peg$silentFails--; | |
if (s0 === peg$FAILED) { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e18); } | |
} | |
return s0; | |
} | |
function peg$parseinteger() { | |
var s0, s1, s2, s3; | |
peg$silentFails++; | |
s0 = peg$currPos; | |
s1 = peg$currPos; | |
s2 = []; | |
s3 = input.charAt(peg$currPos); | |
if (peg$r7.test(s3)) { | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e22); } | |
} | |
if (s3 !== peg$FAILED) { | |
while (s3 !== peg$FAILED) { | |
s2.push(s3); | |
s3 = input.charAt(peg$currPos); | |
if (peg$r7.test(s3)) { | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e22); } | |
} | |
} | |
} else { | |
s2 = peg$FAILED; | |
} | |
if (s2 !== peg$FAILED) { | |
s1 = input.substring(s1, peg$currPos); | |
} else { | |
s1 = s2; | |
} | |
if (s1 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s1 = peg$f6(s1); | |
} | |
s0 = s1; | |
if (s0 === peg$FAILED) { | |
s0 = peg$currPos; | |
if (input.substr(peg$currPos, 3) === peg$c11) { | |
s1 = peg$c11; | |
peg$currPos += 3; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e23); } | |
} | |
if (s1 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s1 = peg$f7(); | |
} | |
s0 = s1; | |
if (s0 === peg$FAILED) { | |
s0 = peg$currPos; | |
if (input.substr(peg$currPos, 4) === peg$c12) { | |
s1 = peg$c12; | |
peg$currPos += 4; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e24); } | |
} | |
if (s1 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s1 = peg$f8(); | |
} | |
s0 = s1; | |
if (s0 === peg$FAILED) { | |
s0 = peg$currPos; | |
if (input.substr(peg$currPos, 4) === peg$c13) { | |
s1 = peg$c13; | |
peg$currPos += 4; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e25); } | |
} | |
if (s1 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s1 = peg$f9(); | |
} | |
s0 = s1; | |
} | |
} | |
} | |
peg$silentFails--; | |
if (s0 === peg$FAILED) { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e21); } | |
} | |
return s0; | |
} | |
peg$result = peg$startRuleFunction(); | |
if (options.peg$library) { | |
return /** @type {any} */ ({ | |
peg$result, | |
peg$currPos, | |
peg$FAILED, | |
peg$maxFailExpected, | |
peg$maxFailPos | |
}); | |
} | |
if (peg$result !== peg$FAILED && peg$currPos === input.length) { | |
return peg$result; | |
} else { | |
if (peg$result !== peg$FAILED && peg$currPos < input.length) { | |
peg$fail(peg$endExpectation()); | |
} | |
throw peg$buildStructuredError( | |
peg$maxFailExpected, | |
peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, | |
peg$maxFailPos < input.length | |
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) | |
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos) | |
); | |
} | |
} | |
return { | |
StartRules: ["Metrics"], | |
SyntaxError: peg$SyntaxError, | |
parse: peg$parse | |
}; | |
})() | |
; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Online Version: https://peggyjs.org/online.html | |
Metrics | |
= "\n"* @Metric|.., "\n\n"| "\n"* | |
Metric | |
= help:Help "\n" type:Type values:("\n" @Value)* { return { help, type, values }; } | |
Help | |
= "# HELP " name:name " " help:$([^\n]*) { return { name, help }; } | |
Type | |
= "# TYPE " name:name " " type:$([a-z]i+) { return { name, type }; } | |
Value | |
= name:name labels:Labels " " value:integer { return { name, labels, value }; } | |
Labels | |
= "{" @Label|1.., ","| "}" | |
/ "" { return []; } | |
Label | |
= name:labelName "=\"" value:$(("\\" . / [^\\\"])*) "\"" { return { name, value }; } | |
name "metric name" | |
= $([a-zA-Z_:][a-zA-Z0-9_:]*) | |
labelName "label name" | |
= $([a-zA-Z_][a-zA-Z0-9_]*) | |
integer "number" | |
= digits:$[0-9.]+ { return parseFloat(digits); } | |
/ "Nan" { return NaN; } | |
/ "-Inf" { return -Infinity; } | |
/ "+Inf" { return +Infinity; } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment