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.

43 lines
1.0 KiB
JavaScript

"use strict";
const memoizee = require("memoizee");
const fs = require("fs").promises;
const unreachable = require("@joepie91/unreachable")("cvm");
const lsblk = require("../exec-lsblk");
const All = require("../graphql-interface/symbols/all");
const treeFind = require("../tree-find");
const treeMapAsync = require("../tree-map-async");
function makePredicate({ path, name }) {
if (path != null) {
return (device) => device.path === path;
} else if (name != null) {
return (device) => device.name === name;
} else {
unreachable("No selector specified for lsblk");
}
}
module.exports = function () {
let lsblkOnce = memoizee(async () => {
return treeMapAsync(await lsblk(), async (device) => {
return {
... device,
path: await fs.realpath(device.path)
};
});
});
return async function (selectors) {
let blockDeviceTree = await lsblkOnce();
return selectors.map((selector) => {
if (selector === All) {
return blockDeviceTree;
} else {
return treeFind(blockDeviceTree, makePredicate(selector));
}
});
};
};