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.

85 lines
2.0 KiB
JavaScript

'use strict';
const drvParser = require("./drv");
function valueType(value) {
if (typeof value === "string") {
return "string";
} else {
return value.type;
}
}
function assertType(value, expectedType) {
if (valueType(value) == null) {
throw new Error(`Expected a '${expectedType}', got nothing`);
} else if (valueType(value) !== expectedType) {
throw new Error(`Expected a '${expectedType}', got '${valueType(value)}'`);
} else {
return true;
}
}
function assertedValue(type, value) {
if (assertType(value, type)) {
return value;
}
}
function mapArray(array, callback) {
return assertedValue("array", array).items.map(callback);
}
function mapTuple(tuple, fields, callback) {
return assertedValue("tuple", tuple).items.reduce((result, item, i) => {
if (fields[i] != null) {
let value;
if (callback != null) {
value = callback(item, i);
} else {
value = item;
}
result[fields[i]] = value;
return result;
} else {
throw new Error(`Attempted to map field ${i}, but only ${fields.length} field names were specified`);
}
}, {});
}
function parseDerivation(text) {
let root = parseAST(text);
return {
outputs: mapArray(root.items[0], (item) => {
return mapTuple(item, ["name", "path", "expectedHashAlgorithm", "expectedHash"]);
}),
inputDerivations: mapArray(root.items[1], (item) => {
return mapTuple(item, ["path", "wantedOutputs"], (value, i) => {
if (i === 1) {
/* An `array` of outputs */
return value.items;
} else {
return value;
}
});
}),
inputSources: assertedValue("array", root.items[2]).items,
platform: assertedValue("string", root.items[3]),
builder: assertedValue("string", root.items[4]),
builderArguments: assertedValue("array", root.items[5]).items,
environmentVariables: mapArray(root.items[6], (item) => {
return mapTuple(item, ["name", "value"]);
})
}
};
function parseAST(text) {
return drvParser.parse(text);
}
parseDerivation.ast = parseAST;
module.exports = parseDerivation;