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.

55 lines
1.4 KiB
JavaScript

"use strict";
const Promise = require("bluebird");
const memoizee = require("memoizee");
const asExpression = require("as-expression");
const fs = Promise.promisifyAll(require("fs"));
const unreachable = require("@joepie91/unreachable")("cvm");
const lsblk = require("../../packages/exec-lsblk");
const All = require("../../packages/graphql-interface/symbols/all");
const findInTree = require("../../packages/find-in-tree");
const treeMapAsync = require("../../packages/tree-map-async");
module.exports = function () {
let lsblkOnce = memoizee(() => {
return Promise.try(() => {
return lsblk();
}).then((tree) => {
return treeMapAsync(tree, async (device) => {
return {
... device,
path: await fs.realpathAsync(device.path)
};
}, true);
});
});
return function (selectors) {
return Promise.try(() => {
return lsblkOnce();
}).then(({tree, list}) => {
return selectors.map((selector) => {
if (selector === All) {
return tree;
// return list;
} else {
let { path, name } = selector;
let predicate = asExpression(() => {
if (path != null) {
return (device) => device.path === path;
} else if (name != null) {
return (device) => device.name === name;
} else {
unreachable("No selector specified for lsblk");
}
});
// TODO: Shouldn't this pick from the list instead?
return findInTree({ tree, predicate });
}
});
});
};
};