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.

63 lines
1.6 KiB
JavaScript

"use strict";
const Promise = require("bluebird");
const memoizee = require("memoizee");
const asExpression = require("as-expression");
const fs = Promise.promisifyAll(require("fs"));
const lsblk = require("../../packages/exec-lsblk");
const All = require("../../packages/graphql-interface/symbols/all");
const treecutter = require("../../packages/treecutter");
const findInTree = require("../../packages/find-in-tree");
const shallowMerge = require("../../packages/shallow-merge");
const unreachable = require("../../packages/unreachable");
module.exports = function () {
let lsblkOnce = memoizee(() => {
return Promise.try(() => {
return lsblk();
}).then((tree) => {
return treecutter.flatten(tree);
}).map((device) => {
return Promise.try(() => {
return fs.realpathAsync(device.path);
}).then((actualPath) => {
return shallowMerge(device, {
path: actualPath
});
});
}).then((devices) => {
return {
tree: treecutter.rebuild(devices),
list: devices
};
});
});
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");
}
});
return findInTree({ tree, predicate });
}
});
});
};
};