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
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;
|